Olen tutkinut satunnaislukuja useita vuosia, ja etsinyt sellaista satunnaislukugeneraattoria, joka ei ihan heti rupeaisi toistamaan itseään, ja antaisi joka sfäärissä tasaisen jakauman, ja olisi suhkot tehokas funktio kellojaksojen suhteen.
Annoin rnd() laskea 100*2^32 satunnaislukua, eikä sekvenssi ruvennut toistamaan itseään. Minulla on 2 melko tehokasta läppäriä, ja pistän toisen tietokoneen tutkimaan, kuinka pitkä sekvenssi on. Saa jauhaa muutaman päivän, ja etsiä sekvenssin pituutta.
Metabolix osoitti taannoin, että satunnaislukugeneraattorini sekvenssi oli jotain 2^32. Tutkin ongelmaa, ja löysin ratkaisun modifioimalla rnd()-funktiota vähän.
unsigned rnd(void) { static unsigned long r1=1; static unsigned long r2=2; static unsigned loop=0x01; r1 -= 0x012357bf + loop; r2 += 0xfedca201 - loop; r1 += (r1>>16)^(r2<<16); r2 -= (r1<<16)^(r2>>16); return ++loop ^ r1 ^ r2; }
Mikä on siis ongelma? Siemenluvun vaihtaminen vaikka miljoonan tai miljardin satunnaisluvun jälkeen on varmasti kivuttomampaa kuin koko generaattorin rampauttaminen.
Listaan muutaman ajatuksen muita lukijoita varten. Kokeneena koodaajana ja alan tutkijana jone2712 tietää nämä jo.
- Kannattaa käyttää tyyppejä kuten uint32_t
ja uint64_t
, koska niiden koko ei riipu alustasta tai kääntäjästä. Erityisesti tyyppien unsigned
ja unsigned long
sekoittaminen jättää koodin tarkoituksen epäselväksi.
- Satunnaislukugeneraattorin periodia ei kannata yrittää selvittää brute forcella vaan matematiikalla. 96 bitin kokoisella tilalla periodin toivoisi tietysti olevan lähempänä kokoluokkaa 2^96 kuin 2^32. Jos koodi on syntynyt yhdistelemällä satunnaisia operaatioita ja taikavakioita, analyysi voi tietysti olla vaikeaa.
- Siemenlukua ei tietenkään kannata vaihtaa ajoittain. Kannattaa käyttää hyvää satunnaislukugeneraattoria.
Lisää tietoa satunnaislukugeneraattoreista ja yksi hyvä sellainen löytyy sivustolta https://www.pcg-random.org/
jlaire kirjoitti:
(13.07.2023 01:15:20): Listaan muutaman ajatuksen muita lukijoita...
Tuo rand-pcg ei kuitenkaan sovellu krypto hommiin. Hyvä laatuinen satunnaisluku generaattori yleiskäyttöön kuitenkin.
Minun random -testifunktio löysi tästä rnd() -funktiosta heikon lenkin, joten lyhyesti voi todeta, että paska-koodi, mutta tulipahan tehtyä. Takaisin sorvin ääreen…
Aihe on jo aika vanha, joten et voi enää vastata siihen.