Teen tässä pientä matopeliä ja olen siinä vaiheessa että pitäisi kirjoittaa koodi joka arpoo "ruuan" paikkan, mutta mitä muita tapoja on arpoa "ruuan" paikkan kuin: cstr(int(rnd() * 300)) siis sellaisia joissa "ruoka" ei arpoituisi aina samaan paikkaan.
ranodomize ohjelman alkuun
No eihän se aina tule samaan paikkaan jos kerran randomilla pistelet. Muistathan laittaa ennen arpomista randomize timer?
"randomize timer", hä?
niin, randomize timer. nii ja huono otsikko... :P
randomize timer
ruuanpaikka=int(rnd() * 300)
VB.NETissä riittää tämä rivi ohjelman alussa:
Randomize()
Ja vielä varmistuksena, randomize komentoa ei saa "antaa" kuin kerran ohjelman alussa. Ei koskaan useammin.
Tuota, köh köh
Itse asiassa Randomize komennon saa antaa juuri niin monta kertaa kuin haluaa koodissa.
Randomize alustaa satunnaislukugeneraattorin ja ottaa järjestelmäkellosta uuden siemenluvun. Jos laitat komentoon numeron perään satunnaislukugeneraattori käyttää sitä siemenlukuna. Esim: Randomize 123
lainaus:
Itse asiassa Randomize komennon saa antaa juuri niin monta kertaa kuin haluaa koodissa.
Väärin!
lainaus:
Randomize alustaa satunnaislukugeneraattorin ja ottaa järjestelmäkellosta uuden siemenluvun. Jos laitat komentoon numeron perään satunnaislukugeneraattori käyttää sitä siemenlukuna. Esim: Randomize 123
Tämä taas on oikein.
Kuten sanoit, randomize ALUSTAA satunnaislukugeneraattorin. Jos annat AINA komennon randomize 123 enne arvontaa saat AINA saman arvontatuloksen. (hieman yksinkertaistettu) Mikä arvonta se sellaine on joka antaa aina saman tuloksen?
Jos annat vain randomize komennon, se alustaa, kuten sanoit, satunnaislukugeneraattorin järjestelmänkellon mukaan. Jos teet aina tuon alustuksen, voi olla että saat esim 1000 luvun arvonnasta aina tuloksen alle 500. Jokatapauksessa jos vähän mittailet tuolla tavalla arvottuja tuloksia niin ne eivät ole satunnaisia.
Valitettavasti en tähän hätään löytäny hirmu tarkkaa selostusta, mutta tämä kelvannee alkuun:
http://www.vbexplorer.com/VBExplorer/random/
"Use Randomize to initialize VB's random number generator. This is called seeding. To avoid generating the same sequence of psuedo-random values, call Randomize before you call Rnd; but this only has to be done once. A good place to seed the psuedo-random number generator is in the Form's Load event."
lainaus:
lainaus:
Itse asiassa Randomize komennon saa antaa juuri niin monta kertaa kuin haluaa koodissa.
Väärin!
Eipäs ole. Saa Randomizen antaa juuri niin monta kertaa, kuin huvittaa. Se, onko siinä mitään järkeä, on toki kokonaan toinen asia...
Onhan siitä se hyöty että siemen luku voi halutessa vaihtaa. Jos meinaan haluaa vielä satunnaisemman luvun. Kun siinä on vissiin aina jonkin verran säännöllisyyttä.
eipä kannata mitään randomize timeriä tunkee silmukoiden sisään ennemmin ohjelman rungon alkuun tai jonnekkin jne...
ihan vain sen takia että jos on monta randomoijaa niin se randomoi ja miinustaa varmuutta olla satunnainen, jos on vain yksi ainut randomoija niin se pitää yllä koko satunnaisuutta joka ei sinänsä koneessa koskaan tapahdu sattumalta :)
Ohjelma tehty VB6:lle
Private Sub Form_Activate() Dim I As Long Dim Nolla As Long Dim Yksi As Long Randomize 'Randomize vain kerran Nolla = 0 Yksi = 0 For I = 0 To 1000000 If Int(2 * Rnd) = 0 Then Nolla = Nolla + 1 Else Yksi = Yksi + 1 Next I MsgBox "Ykkösiä " & Yksi & vbCrLf & "Nollia " & Nolla Nolla = 0 Yksi = 0 For I = 0 To 1000000 Randomize 'Randomize aina If Int(2 * Rnd) = 0 Then Nolla = Nolla + 1 Else Yksi = Yksi + 1 Next I MsgBox "Ykkösiä " & Yksi & vbCrLf & "Nollia " & Nolla End Sub
Tietysti joku voi väittää että "toi toinen antaa parempia tuloksia koska vaihtelu on isompi", ei pidä paikkansa vaan se antaa vääristettyjä tuloksia. Huomatkaa että voitte vaihtaa tuon alemman luupin ekaksi, ei muuta mitään.
Aihe on jo aika vanha, joten et voi enää vastata siihen.