Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Generisanje slučajnog niza brojeva

[es] :: Visual Basic 6 :: Generisanje slučajnog niza brojeva

[ Pregleda: 6895 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

esh
Danijel Stulic
art director vesh mashine
Kragujevac

Član broj: 4917
Poruke: 5
*.verat.net

Sajt: www.etnopunk.org.yu


Profil

icon Generisanje slučajnog niza brojeva14.08.2002. u 01:00 - pre 233 meseci
Trebao bi mi kod generisanja slučajnih 20 brojeva bez ponavljanja iz niza od na primer 30 različitih brojeva u ASP-u.
Jasno je da su 20 i 30 parametri.
Ako neko ima pri ruci nešto što bi vršilo posao.
Primer za 3 broja iz niza od 5 brojeva
Prvi niz: A(10,12,8,11,15)
Drugi niz koji treba da se dobije: B(10,8,15).

Problem jeste dibidus prost, al nešto mi se ne da da ukucam jednu liniju koda, pa ako ima neko da naleti sa nekom genijalno optimizovanom varijantom koda :).
 
Odgovor na temu

Marko Bijelic

Član broj: 3296
Poruke: 1077
*.dialup.blic.net

Sajt: markobijelic.com


+1 Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 10:41 - pre 233 meseci
Osnovna forumula je:

Int((najveci_broj - najmanji_broj + 1) * Rnd + najmanji_broj)


Najjednostavniji moguci primjer u 3 linije koda kao polazna osnova za random izbor broja izmedju 1 i 30:

Code:

<% randomize 
RandomNumber=Int((30 - 1 + 1) * Rnd + 1)
response.write RandomNumber %>


Pogledaj i tutorial na: http://www.meelix.com/devcode/prng-demo.asp
 
Odgovor na temu

jc denton

Član broj: 2358
Poruke: 1705
*.ptt.yu



Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 11:42 - pre 233 meseci
Ajde ovako na prvu loptu :)

Code:

        Dim a() As Byte
        Dim b() As Byte
        Dim n As Byte
        Dim m As Byte
        Dim k As Byte
        Dim i As Integer

        n = 30
        m = 20

        ReDim a(n) 
        ReDim b(m) 

    ' neke vrednosti za probu
        For i = 0 To n - 1
            a(i) = i
        Next

        ' sad ide 'genijalno optimizovana varijanta koda' :) 
        For i = 0 To 1000 ' sto veci broj to ce vise da se pretumba
            k = Rnd() * (n - 2)
            a(k) = a(k) + a(k + 1)
            a(k + 1) = a(k) - a(k + 1)
            a(k) = a(k) - a(k + 1)
        Next

    ' rezultat 
        For i = 0 To m - 1
            b(i) = a(i)
        Next


poz.
fire, walk with me
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 11:42 - pre 233 meseci
Recimo da je A ulazni niz, a B izlazni niz i pretpostavimo da prvi element u nizu ima indeks 0.

Funkcija Foo(A, B,Brojac):
Slucajni broj (R) treba da bude u rangu 0...indeks zadnjeg elementa u nizu A.
Kada dobijes slucajni broj, procitas element iz niza A sa indeksom R.
Taj broj prebacis u niz B.
Iz niza A izbaci element koji si prebacio u niz B (kako bi izbegao ponavljanje).
Brojac umanji za 1 (ili uvecaj, zavisi kako postavis stvari..)
Rekurzija (uz proveru uslova za izlaz).



[Ovu poruku je menjao degojs dana 14.08.2002 u 08:56 AM GMT]
Commercial-Free !!!
 
Odgovor na temu

jc denton

Član broj: 2358
Poruke: 1705
*.ptt.yu



Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 12:02 - pre 233 meseci
Funkcija 'pije vodu', samo kako da se izbaci taj clan niza koji je vec koriscen ?
Degojs da li mozes da napises piece of code za to ?
fire, walk with me
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 12:33 - pre 233 meseci
Jednostavno ako imas niz A(1,2,8,6,9) i recimo hoces da izbacis treci element (=8) tada samo clanove iza tog elementa pomeris ulevo, a onda promenis velicinu niza - nesto poput:
For i = 2 to 3 ' krecemo od 2 (=3. clan) i idemo do predzadnjeg
a(i)=a(i+1) ' pomeramo clanove ulevo
Next i
ReDim Preserve A(Ubound(A)-1)

Drugo (kompletno) resenje bi bilo koristenjem kolekcija sto je jos lakse (doduse, sad se ne secam tacno da li kolekcije uopste postoje u ASP-u:)

Ne znam da li si me pitao za kod komplet resenja ili samo za ovo gore za izbacivanje odredjenog clana. Ako si trebao komplet resenje, ja bas nisam voljan da se zezam jer moze lako da se zeznes na neki UBOUND i LBOUND: drugim recima, nije uopste komplikovan algoritam samo oduzelo bi malo vremena da budes siguran bas 100% da radi bez greske, a ja bas ne volim da pisem tudji domaci pogotovo u 6:30 am :) Da ne pominjem da do sad ima jedno resenje (tvoje) i jedno uputstvo pa nek malo zasuce rukave:)))

Ako bas covek zapne, ce da pisemo...

Commercial-Free !!!
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 15:39 - pre 233 meseci
Ajd evo uz kavu jutarnju.. :)

Code:

Private Sub DajNizB(ByRef nizA() As Integer, ByRef nizB() As Integer, ByRef brojac As Integer)
Dim upperA As Integer
Dim upperB As Integer
Dim i As Integer
Dim r As Integer

upperA = UBound(nizA)
upperB = UBound(nizB)

Randomize (Timer)
r = Int(Rnd(1) * (upperA + 1))

nizB(brojac) = nizA(r)
brojac = brojac + 1

For i = r To upperA - 1
    nizA(i) = nizA(i + 1)
Next i
ReDim Preserve nizA(upperA - 1)
If brojac > upperB Then
    Exit Sub
End If
Call DajNizB(nizA, nizB, brojac)
End Sub


POZIVANJE: Call DajNiz(NizA, NizB, 0)
Code:

Private Sub Command1_Click()
Dim nizA() As Integer
Dim nizB() As Integer
Dim i As Integer

ReDim nizA(29)
ReDim nizB(19)

For i = 0 To UBound(nizA) ' generisemo niz A - upisujemo brojeve 0..max
    nizA(i) = i
Next i

Debug.Print vbCrLf
Debug.Print "NIZ A (original): ";
For i = 0 To UBound(nizA)
    Debug.Print nizA(i) & ",";
Next i
Debug.Print

Call DajNizB(nizA, nizB, 0)

Debug.Print "NIZ A (smanjen): ";
For i = 0 To UBound(nizA)
    Debug.Print nizA(i) & ",";
Next i
Debug.Print
Debug.Print "NIZ B: ";
For i = 0 To UBound(nizB)
    Debug.Print nizB(i) & ",";
Next i

End Sub

Commercial-Free !!!
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 16:11 - pre 233 meseci
I za kraj: mozda najjednostavnije resenje je 'simulacija' resenja pomocu kolekcija.
Resenje se u biti sastoji da izbacimo neke (slucajno odabrane) elemente iz niza.
Nesto poput (pisem onako iz glave, bez provere):

Sub Foo(byRef nizA() as integer, byVal brojElemenataUIzlaznomNizu as Integer)
For i = 1 to Ubound(nizA)+1-brojElemenataUIzlaznomNizu ' koliko elemenata izbacujemo iz niza A toliko puta prolazimo kroz petlju
r=int(rnd(1)*(Ubound(nizA)+1)) ' biramo slucajni element niza A
' izbacujemo element iz niza:
For j=r to Ubound(nizA)-1
nizA(j)=nizA(j+1)
Next j
ReDim Preserve nizA(ubound(nizA)-1) ' smanjujemo velicinu niza za 1
Next i
End Sub

Mana: za svaki element koji izbacimo moramo da pomerimo sve elemente (iza tog koji izbacujemo) ulevo. Znaci moze da bude malo sporije, mada je to usporenje verovatno nesto sto se tesko da primetiti, ako se ne radi o ogromnim nizovima.

Napominjem: kod gore nije proveren, pisem ga onako 'na prvu' sto bi rekao denton.

pozdrav:)
Commercial-Free !!!
 
Odgovor na temu

jc denton

Član broj: 2358
Poruke: 1705
*.ptt.yu



Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 19:38 - pre 233 meseci
Degojs, svidelo mi se tvoje resenje, pa rekoh da optimizujem malo resenje:

Code:

Declare Sub RtlMoveMemory Lib "kernel32" _
(ByVal hpvDest As Long, ByVal hpvSource As Long, ByVal cbCopy As Long)

Dim a() As Byte
Dim b() As Byte
Dim c() As Byte

n = 1000000
m = 1000

ReDim a(n - 1) ' original
ReDim c(n - 1) ' za shrink
ReDim b(m - 1) ' rezultat


' vrednosti za probu
For i = 0 To n - 1
    a(i) = Rnd * 255
Next

c = a ' kopija

i = 0
Do
    indeks = Int(Rnd * (n - 1 - i))
    b(i) = c(indeks) ' ovde se pakuje
    RtlMoveMemory VarPtr(c(indeks)), VarPtr(c(indeks + 1)), (n - i - indeks)
    i = i + 1
    ReDim Preserve c(n - 1 - i)
    
    If i = m Then Exit Do
Loop


Dakle, RtlMoveMemory kopira i overlaped memorijske blokove (kada se destination i source 'preklapaju'), pa je zato veoma pogodno iskoristiti istu funkciju u cilju vece brzine, kao ovde.
Inace VarPtr vraca pointer (Long) na promenljivu i jos je i nedokumentovana funkcija, a mozda i jedina alatka za nas VB programere u ovakvim i slicnim slucajevima.

Jeste da je resenje vise za VB nego za ASP, a mozda i ne moze uopste da se iskoristi u ASP-u :)

pozdrav

fire, walk with me
 
Odgovor na temu

esh
Danijel Stulic
art director vesh mashine
Kragujevac

Član broj: 4917
Poruke: 5
*.verat.net

Sajt: www.etnopunk.org.yu


Profil

icon Re: Generisanje slučajnog niza brojeva14.08.2002. u 21:22 - pre 233 meseci
Evo koda koji je zavrsio posao.

Sub slucajanNiz(nizA(),brojElemenata)

For i = 1 to Ubound(nizA)-brojElemenata 'izbacujemo iz niza A clanove u petlji
Randomize(timer)
r=Int(Rnd(1)*(uBound(nizA)+1)) ' biramo slucajni element niza A
' izbacujemo element iz niza:
For j=r to Ubound(nizA)-1
nizA(j)=nizA(j+1)
Next
ReDim Preserve nizA(ubound(nizA)-1) ' smanjujemo velicinu niza za 1
Next

End Sub

Duga sam razmisljao kako ovo SAM da napravim, imao SAM vec par gotovih SAMOSTALNIH resenja (u MOJIM reply-ima gore), i onda SAM se dosetio super fore da je po MENI najbolje resenje izbaciti slucajno neke clanove iz niza :))), pa sam ubacio u degojsov (jegiga bolje je reci 'MOJ' :))) ) kod Randomize(timer) i jedan kec je bio viska.
Ne mogu a da ne kazem da SAM zaista prijatno iznenadjen odzivom, eto mene i sutra sa novim domacim :). Ko ce pored vas sve SAM da programira :). Ali eto drago MI je da na kraju mogu da podelim MOJ kod sa vama :).

pozdrav
 
Odgovor na temu

[es] :: Visual Basic 6 :: Generisanje slučajnog niza brojeva

[ Pregleda: 6895 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.