Ohjelma arpoo taulukosta vuorotellen jokaisen luvun, muttei koskaan arvo samoja lukuja uudelleen. Keksin toimintaperiaatteen itse, mutta se on niin yksinkertainen, että joku on luultavasti keksinyt sen jo aikaisemmin.
Menetelmä on seuraava: Ensin arvotaan taulukkoon luvut. Sitten luodaan silmukka jota toistetaan niin monta kertaa kuin taulukossa on lukuja. Joka kierroksella arvotaan taulukosta yksi luku Rnd-funktiolla. Tämä luku voi olla väliltä 1-lukujen määrä. Joka kierroksella korkein mahdollinen luku pienenee yhdellä, joten jos lukuja olisi 200, ensimmäisellä kierroksella arvotaan luku väliltä 1-200, toisella väliltä 1-199, kolmannen väliltä 1-198 jne. Näin arvottavien lukujen ulkopuolelle kuitenkin jää aina taulukon viimeinen luku, mutta se ei haittaa sillä tuo luku kopioidaan juuri arvotun luvun paikalle, jolloin juuri arvottua lukua ei myöskään voi arpoa enää uudelleen.
Tässä esimerkissä visualisoidaan algoritmin toimintaa käyttämällä arvottavina lukuina ruudun koordinaatteja. Näin ohjelmaa piirtää ruudun täyteen satunnaisia pikseleitä, muttei koskaan arvo samaa pikseliä kahta kertaa.
Private Sub Form_Load()
Dim Pikseli(1 To 250000, 1 To 2) As Integer 'alustetaan
For y = 0 To 499
For x = 0 To 499
i = i + 1
Pikseli(i, 1) = x 'tallennetaan taulukkoon jokaisen pikselin koordinaatit
Pikseli(i, 2) = y
Next x
Next y
Form1.Width = 8000
Form1.Height = 8000
Form1.Show 'näytetään formi
Form1.ScaleMode = 3 'pixelit käyttöön
For a = 250000 To 1 Step -1
i = Int(Rnd * a) + 1 'arvotaan taulukosta pikseli
PSet (Pikseli(i, 1), Pikseli(i, 2)) 'piirretään pikseli
Pikseli(i, 1) = Pikseli(a, 1) 'kopioidaan taulukon viimeinen pikseli
Pikseli(i, 2) = Pikseli(a, 2) 'äsken piirretyn tilalle, jotta voidaan
'huoletta poistaa viimeinen pikseli
Next a
End Subkävevä
Joo, juuri tällä tekniikalla kannattaa tehdä esim. lottonumeroiden arpominen.
Kätevä systeemi.
Keygenin alku. :p
Aihe on jo aika vanha, joten et voi enää vastata siihen.