Piszę funkcję kid sister encryption i potrzebuję PRNG, który produkuje spójne wyniki w różnych systemach operacyjnych (więc nie ma matematyki zmiennoprzecinkowej, korzystając ze sprzętu lub oprogramowania na poziomie systemu). Byłoby to miłe, ale niekonieczne, ponieważ PRNG miał okres dłuższy niż 2 .Potrzebuję przenośny, zgodny generator liczb pseudolosowych
Obecnie używam 32-bitowy Xorshift:
#!/usr/bin/perl
use strict;
use warnings;
{
use integer; #use integer math
my $x = 123456789;
my $y = 362436069;
my $w = 88675123;
my $z = 521288629;
sub set_random_seed {
$w = shift;
}
sub random {
my $t = $x^($x << 11);
$x = $y;
$y = $z;
$z = $w;
my $rand = $w = ($w^($w >> 19))^($t^($t >> 8));
return $rand % 256; #scale it back to a byte at a time
}
}
set_random_seed(5);
print map { random(), "\n" } 1 .. 10;
Ale martwię się, bo nie bardzo rozumiem jak to działa. Na przykład oryginalne źródło nie miało możliwości ustawienia nasion, więc dodałem jeden, ale nie wiem, czy wybrałem poprawną zmienną dla nasienia.
Tak, to wszystko sprowadza się do
- Wiesz modułu na CPAN, który pasuje do moich potrzeb?
- Jeśli nie, czy znasz algorytm, który pasuje do moich potrzeb?
Ale czy jest to zgodne? Jeśli założę to na 5, da takie same wyniki na Linuksie, BSD, OS X, Win32, itd. –
Jeśli przeczytasz ten link do Wikipedii, zauważysz, że pierwszą rzeczą, o której mówi w "Aplikacja", jest to, że nie jest odpowiedni do kryptografii. – cjm
@cjm: jeśli czytasz ten link do siostrzanej siostrzyczki, zauważysz, że to prawdopodobnie nie ma znaczenia. – ysth