Moni Qbasicin käyttäjä tietää varmasti Randomizen. Sen systeemin, jolla saa aikaan täysin satunnaisia lukuja tai muita, vai saako? Tässä on pieni esimerkki sen käytöstä. Ohjelma arpoo lukuja 0 ja 1000 välillä. Jos tulee luku tuhat, ohjelma lopetetaan. Bonuksena se tallentaa kaikki arvotut luvut tiedostoon, mistä niitä voi tutkia. Jos muutatte tuon 1000 vaikka esim. 457 niin se vaikuttaa ohjelmaan yllättävänkin paljon. Kokeilkaa ja huomaatte että Randomize ei taidakaan olla ihan täysin satunnainen.
-Grey-
RANDOMIZE TIMER CLS start! = TIMER OPEN "Rndtest.txt" FOR OUTPUT AS #1 DO a = INT(RND * 1000 + 1) PRINT a PRINT #1, a IF a = 1000 THEN EXIT DO 'Muuttakaas tätä lukemaa hiukkasen LOOP finish! = TIMER s = finish! - start! PRINT "Aikaa meni"; s; "sek!" PRINT #1, s CLOSE #1
Hmm.. mitä yrität tässä nyt tarkalleen ottaen todistaa?
On itsestään selvää, että QB:n RND-funktion tuottamat luvut eivät ole täysin satunnaisia, vaan perustuvat seediin, joka annetaan RANDOMIZE -käskyllä (tässä tapauksessa TIMER, jolla saadaan eräänlainen satunnaisuus).
Jos pistää RANDOMIZE 123, antaa QB joka ohjelman suorituksella samat arvot. Näin saadaan aikaan satunnaisuus, joka on joka kerta samanlainen, mutta silti satunnaisen tuntuinen. Hyötyä mm. demoefekteissä, jos niiden halutaan näyttävän aina samoilta.
Turvallisuutta ei RANDOMIZE TIMER-tyylisillä satunnaisuuksilla saa pätkän vertaa minkä takia niitä ei tulisi käyttää mihinkään vakavampaan kuten kryptografia avainparien tekemiseen (esim. RSA).
Joo...
Randomissa kaikkein suurin, ehkä pieninkin, luku tulee kaikkein suurimmalla todennäköisyydellä kohdalle. Tuo koodi näyttää sen homman ja samalla siinä on ajastin, joka kertoo miten pitkään kesti ennenkuin kyseinen luku tuli kohdalle. Mitä hyötyä tuosta koodista muuten oli, sitä ei kannata minulta kysyä. Tein tuon meinaan aamuyöllä ja nappasin tänne. Noh, jaah. Ainakin siitä näkee Randomizen periaatteen, luulisin...
-Grey-
No kysytään sitten. Mitä hyötyä tuosta koodista on?
Kun käy täällä aamuyöstä, on todennäköisesti hankala keksiä millekään myöhemmin mitään järkevää selitystä. Jos minun pitäisi kuitenkin hyödyntää tuota koodia, noh, ainakin siitä näkee Randomizen käyttöä, tiedostoon kirjoittamista ja aikalaskurikin löytyy siitä. Kuten sanottu, aamuyö on aamuyö.
-Grey-
Aamuyö ei tekoajankohtana lievennä rikoksien tuomitsemista oikeassakaan elämässä - ei siis täälläkään!
Aina voi tehdä mielentilatutkimuksen :-) Kuitenkin, jos ei muuta, paljastaa ainakin tuo joitain heikkouksia Randomizen käytössä.. Hm.. Jooh, kyllä tuosta on hyötyä. Tajusin nimittäin että saatan joutua miettimään erään projektini vähän uudelleen. Jos kerran RANDOMIZE TIMER valitsee helpoiten suurimman luvun, täytynee keksiä jokin toinen siihen tilalle. Ei muuten, mutta ne jotka tuntevat RQ ja D100, tietävät että heitto 100 on täydellinen epäonnistuminen aina. Jooh, olen pienehkön rooliseikkailun kimpussa.
-Grey-
Ihan kätsä aloittelijoille (kuten minulle).
en tajua mikä tuon "vinkin" idea on?
Tuli tässä vain tehtyä salausohjelma joka käyttää tätä "satunnaisuutta"
Aika yksinkertainen...
Lähinnä siitä oppii (tai ainakin minä opin) aikalaskurin...
Voisiko joku ystävällisesti kertoa, miten tuon saisi suljettua Esc-nappulalla, sillä kun a:n arvoa nostaa yli 1000, arvoo kone loputtomasti lukuja ja tulos on lopuksi kovalevyn täyttyminen.
siansaksamies kirjoitti:
Voisiko joku ystävällisesti kertoa, miten tuon saisi suljettua Esc-nappulalla, sillä kun a:n arvoa nostaa yli 1000, arvoo kone loputtomasti lukuja ja tulos on lopuksi kovalevyn täyttyminen.
IF INKEY$ = CHR$(27) then close #1:end end if
Niin ja huomaa että ei oo täysin random.
Aihe on jo aika vanha, joten et voi enää vastata siihen.