Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: random

jone2712 [09.07.2023 21:38:03]

#

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;
}

muuskanuikku [12.07.2023 15:18:54]

#

Mikä on siis ongelma? Siemenluvun vaihtaminen vaikka miljoonan tai miljardin satunnaisluvun jälkeen on varmasti kivuttomampaa kuin koko generaattorin rampauttaminen.

jlaire [13.07.2023 01:15:20]

#

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/

jalski [13.07.2023 07:43:11]

#

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.

jone2712 [13.07.2023 20:21:06]

#

Minun random -testifunktio löysi tästä rnd() -funktiosta heikon lenkin, joten lyhyesti voi todeta, että paska-koodi, mutta tulipahan tehtyä. Takaisin sorvin ääreen…

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta