Stavo giocando con perl's rand() e ho notato che quando si fornisce un argomento più grande di 2^32, gli ultimi bit dell'output diventano prevedibili.Perl: l'output di rand() è parzialmente prevedibile?
Il modo più chiaro che ho trovato di illustrare è con il seguente script:
srand(); for $i (1..10) { printf "%4x\n",rand(2**48)%2**16 }
Ogni volta che eseguo che l'uscita è
5101
6378
2a23
62f2
8d15
effc
9657
2d16
f669
40c0
(Non sono solo i primi 10 valori, ma Non ho visto un punto copiare una lunga lista di numeri "casuali")
La chiamata a srand() è superflua, ma è lì per rendere più facile fornire un argomento, e vedere che non lo fa cambia qualcosa.
Ho provato questo su:
- Debian Squeeze con Perl 5.10 (randbits = 48)
- Debian wheezy con Perl 5.14 (randbits = 48)
- Debian Jessie con Perl 5.20 (randbits = 48)
So che rand() non dovrebbe essere crittograficamente sicuro, ma gli ultimi 16 bit prevedibili sono peggiori di quelli che avevo capito. Sto usando una qualsiasi delle funzioni sbagliate?
@zaph: lo so. Non ho davvero bisogno di numeri crittograficamente sicuri, e potrei andare avanti con i 32 bit non prevedibili (?), Ma ho pensato che fosse strano. – Henrik
Poiché non si tratta di generare un numero casuale che posso usare, si tratta di capire cosa fa rand(). – Henrik
Forse questo aiuta http://stackoverflow.com/a/12993693/632407 – jm666