我正在编写一个小姐妹加密功能,我需要一个 PRNG,它可以在整个操作系统中产生一致的结果(所以没有浮点数学,利用硬件或系统级软件)。这会很好,但不是必需的,因为 PRNG 的周期长于 2 30。
我目前正在使用 32 位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;
但我很担心,因为我真的不明白它是如何工作的。例如,原始来源没有设置种子的能力,所以我添加了一个,但我不知道我是否为种子选择了正确的变量。
所以,所有这一切都归结为
- 你知道 CPAN 上有一个适合我需要的模块吗?
- 如果没有,您知道适合我需要的算法吗?