Grałem z perl's rand() i zauważyłem, że dostarczając argument większy niż 2^32, ostatnie bity wyjścia stają się przewidywalne.Perl: dane wyjściowe funkcji rand() są częściowo przewidywalne?
Najbardziej wyraźny sposób znalazłem z ilustrujący to z poniższego skryptu:
srand(); for $i (1..10) { printf "%4x\n",rand(2**48)%2**16 }
Ilekroć wykonać, że wyjście jest
5101
6378
2a23
62f2
8d15
effc
9657
2d16
f669
40c0
(to nie tylko pierwsze 10 wartości, ale Nie widziałem punktu kopiowania długiej listy "losowych" numerów)
Wywołanie srand() jest zbędne, ale jest po to, aby ułatwić dostarczenie argumentu i zobaczenie, że nie zmienić cokolwiek.
Próbowałem to na:
- Debian Squeeze mających Perla 5.10 (randbits = 48)
- Debiana świszczące mających Perla 5,14 (randbits = 48)
- Jessie Debian mających Perla 5,20 (randbits = 48)
Wiem, że rand() nie ma być kryptograficznie bezpieczny, ale ostatnie 16 bitów jest przewidywalne, jest gorsze niż to, co zrozumiałem. Czy używam żadnej z tych funkcji?
@zaph: Wiem o tym. Naprawdę nie potrzebuję kryptograficznie bezpiecznych numerów i mogłem sobie poradzić z 32 nieprzewidywalnymi (?) Bitami, ale pomyślałem, że to dziwne. – Henrik
Ponieważ NIE chodzi o generowanie liczby losowej, której mogę użyć, chodzi o zrozumienie, co robi rand(). – Henrik
Może to pomaga http://stackoverflow.com/a/12993693/632407 – jm666