[ zormar @ 07.05.2007. 19:57 ] @
Kako napraviti slucajan izbor brojeva Code: uz uslov da je zbir izabranih brojeva jednak broju upisanom u Textbox.for i=1 to 5 A(i)=int(rnd*10)+1 next i |
[ zormar @ 07.05.2007. 19:57 ] @
[ dennycd2 @ 08.05.2007. 17:30 ] @
Ne znam da li si ovo tražio, ali pogledaj može ti pomoći.
Code: Option Explicit Private Sub Command1_Click() Dim a(5) As Integer Dim i As Integer Dim b As Integer Dim x As Long x = 0 If Val(Text1.Text) < 5 Or Val(Text1.Text) > 50 Then MsgBox "Izabrao si prevelik ili premali broj!", vbCritical Text1.Text = "" Text1.SetFocus Exit Sub End If Do Randomize b = 0 x = x + 1 For i = 1 To 5 a(i) = Int(Rnd * 10) + 1 b = b + a(i) Next i DoEvents Loop Until Val(Text1.Text) = b MsgBox "Zbir " & a(1) & "+" & a(2) & "+" & a(3) & "+" & a(4) & "+" & a(5) & " = " & b & " jednak je trazenom!" & vbCrLf & "Broj pokusaja: " & x, vbInformation Text1.Text = "" Text1.SetFocus End Sub [ zormar @ 08.05.2007. 20:17 ] @
@dennycd2, zahvaljujem ti za ovaj kod.
Nadam se da cu uspeti da ovo prilagodim svojim potrebama. [ Aleksandar Ružičić @ 08.05.2007. 21:43 ] @
mozda ovako nekako (pisem kod iz glave, tako da su mozda potrebne neke modifikacije da bi proradio):
Code: Function RandomZbir(sabiraka As Long, zbir As Long) As Long() Dim sabirak() As Long, i As Long, z As Long, max As Long ReDim sabirak(1 to sabiraka) z = 0 max = zbir \ 2 For i = 1 To sabiraka - 1 sabirak(i) = Int(Rnd * (max - 1)) + 1 z = z + sabirak(i) max = (zbir - z) \ 2 Next sabirak(sabiraka) = zbir - z RandomZbir = sabirak End Function ' ovako koristis funkciju: Private Sub Command1_Click() Dim sabirak() As Long, i As Long, s As String sabirak = RandomZbir(5, Val(Text1.Text)) s = CStr(Val(Text1.Text)) & " = " for i = 1 to 5 s = s & CStr(Sabirak(i)) If i < 5 Then s = s & " + " Next MsgBox s End Sub Private Sub Form_Load() Randomize Timer ' ovo obavezno pozovi prilikom startovanja programa End Sub [ zormar @ 08.05.2007. 22:47 ] @
Resio sam problem, jos jednom zahvaljujem obojici na pomoci.
Ako ne trazim previse zanima me kako bi ovo islo sa rasponom brojeva? Znaci, da izbaci brojeve ciji je raspon izmedju najveceg i najmanjeg broja upisan u textboxu. [ dennycd2 @ 08.05.2007. 23:06 ] @
@Aleksandar,Veoma mi se dopada tvoje resenje, ali pokusaj sa brojem 6 napr.
[ Aleksandar Ružičić @ 10.05.2007. 22:26 ] @
@dennycd2: u pravu si, nisam mislio na takve slucajeve. mada bi uz malo izmena i to moglo da se sredi, taj kod sam rekoh kucao iz glave, tj nisam ga testirao pre, ali vidi se ideja pa moze lako da se doradi da radi i u takvim situacijama...
@zormar: za broj u rasponu od min do max koristi sledecu "formulu": Code: a = Int(Rnd * (max - min)) + min [ zormar @ 15.05.2007. 13:09 ] @
Na koji nacin iz niza 5,10,15,20,25,30,35,40,45,50 slucajnim izborom izdvojiti 3 broja?
[ rgdrajko @ 15.05.2007. 13:43 ] @
Pa slucajan broj od 1 do 10, pa to posle pomnozi sa 5.
slbroj = Int(Rnd * 10 + 1)*5 [ zormar @ 15.05.2007. 18:13 ] @
@rgdrajko, hvala ti za ovo.
A kako se radi s nizom 1,6,11,16,21,26...? [ Marko_L @ 15.05.2007. 19:34 ] @
Slučajani broj od 0 do 10, pa pomnoži sa 5, pa dodaj 1
[ goranvuc @ 15.05.2007. 20:42 ] @
A evo i opste resenje, za bilo koji niz i bilo koji broj slucajnih clanova tog niza. Za demonstraciju je potreban nov projekat sa jednom formom i jednim CommandButtonom pod imenom "Command1"
Code: Option Explicit Private Sub Command1_Click() Dim varTestNiz As Variant Dim bytBrojClanova As Byte Dim strOdgovor As String Dim strRezultat As String 'Iniciranje niza (moze se naravno i preuzeti postojeci) varTestNiz = Array(1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56) 'Trazi se od korisnika da upise broj clanova koji mu treba strOdgovor = InputBox("Upisite koliko zelite slucajnih brojeva:", "Upis broja", "3") 'Proverava se da li je upisan broj izmedju 1 i 255, zbog byte tipa If Val(strOdgovor) < 1 Or Val(strOdgovor) > 255 Then MsgBox "Morate upisati broj izmedju 1 i 255", vbCritical, "Greska" Exit Sub End If 'Konverzija upisanog teksta u byte tip bytBrojClanova = CByte(strOdgovor) 'Poziv funkcije i spajanje clanova odvojenih zarezom u string strRezultat = Join(NizSlucajnihBrojeva(varTestNiz, bytBrojClanova), ", ") 'Prikaz rezultata MsgBox "Dobili ste niz slucajnih brojeva: " & strRezultat, vbInformation, "Resenje" End Sub Public Function NizSlucajnihBrojeva(ByVal varPolazniNiz As Variant, ByVal bytTrazeniBrojClanova As Byte) As Variant Dim bytCounter As Byte Dim varRezultat As Variant Dim intUkupnoClanova As Integer 'Dimenzionisanje niza brojeva koji ce biti rezultat funkcije (u trazenom primeru niz od 3 clana) ReDim varRezultat(bytTrazeniBrojClanova - 1) 'Aktiviranje generatora slucajnih brojeva Randomize 'Odredjivanje broja clanova niza iz kog se uzimaju brojevi po slucajnom izboru intUkupnoClanova = UBound(varPolazniNiz) + 1 'Formiranje rezultujuceg niza u petlji trazeni broj puta For bytCounter = 0 To bytTrazeniBrojClanova - 1 varRezultat(bytCounter) = varPolazniNiz(Int(Rnd * intUkupnoClanova)) Next 'Prosledjivanje konacnog rezultata funkciji NizSlucajnihBrojeva = varRezultat End Function [Ovu poruku je menjao goranvuc dana 15.05.2007. u 23:31 GMT+1] [ Aleksandar Ružičić @ 16.05.2007. 10:15 ] @
@Goran: sa ovakvim resenjem:
Code: varRezultat(bytCounter) = varPolazniNiz(Int(Rnd * intUkupnoClanova)) moze da se dogodi da se jedan isti clan niza pojavi vise puta ( > 1) u rezultatu, ukoliko to nije pozeljno (znaci, ako treba samo jedanput da se pojavi bilo koji clan niza u rezultatu) onda bi funkcija trebala da se napise ovako: Code: Public Function NizSlucajnihBrojeva(ByVal varPolazniNiz As Variant, ByVal bytTrazeniBrojClanova As Byte) As Variant Dim lngCounter As Long Dim varRezultat As Variant Dim lngLBound As Long Dim lngUBound As Long Dim lngTemp As Long Dim varTemp As Variant 'Dimenzionisanje niza brojeva koji ce biti rezultat funkcije (u trazenom primeru niz od 3 clana) ReDim varRezultat(bytTrazeniBrojClanova - 1) 'Aktiviranje generatora slucajnih brojeva Randomize Timer ' mada je moj savet da se Randomize pozove samo prilikom startovanja programa jer ako se ' poziva svaki put kada se pozove funkcija veca je mogucnost da se slucajni brojevi ponove ' zapamtimo donju i gornju granicu niza: lngLBound = LBound(varPolazniNiz) lngUBound = UBound(varPolazniNiz) ' "promesamo" polazni niz: For lngCounter = lngLBound To lngUBound lngTemp = Int(Rnd * (lngUBound - lngLBound)) + lngLBound varTemp = varPolazniNiz(lngCounter) varPolazniNiz(lngCounter) = varPolazniNiz(lngTemp) varPolazniNiz(lngTemp) = varTemp Next 'Formiranje rezultujuceg niza u petlji trazeni broj puta For lngCounter = lngLBound To lngLBound + bytTrazeniBrojClanova - 1 varRezultat(lngCounter) = varPolazniNiz(lngLBound + lngCounter) Next 'Prosledjivanje konacnog rezultata funkciji NizSlucajnihBrojeva = varRezultat End Function [ zormar @ 16.05.2007. 13:49 ] @
Zahvaljujem svima na pomoci, to je ono sto mi je trebalo.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|