我正在搞乱一些代码,用PHP创建一个强大的伪随机数生成器。到目前为止,我有以下内容。
function strongRand($bytes, $min, $max)
{
if(function_exists('openssl_random_pseudo_bytes'))
{
$strong = true;
$n = 0;
do{
$n = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes, $strong)));
}
while($n < $min || $n > $max);
return $n;
}
else{
return mt_rand($min, $max);
}
}
这对我来说几乎是完美的 - 除了我用openssl_random_pseudo_bytes
生成的所有数字都是正数。理想情况下,我想从-x到+ y生成数字。我想过可能会添加另一个PRNG电话来决定一个数字是正数还是负数,但我不确定这是否是最佳方式。
答案 0 :(得分:0)
你可以简单地添加另一个随机函数,我们将使用rand(0,1)
这将生成0或1,如果它是1 $status = 1
,如果它是0 $status = -1
。当我们返回值时,我们乘以$ status:
function strongRand($bytes, $min, $max)
{
$status = mt_rand(0,1) === 1 ? 1:-1;
if(function_exists('openssl_random_pseudo_bytes'))
{
$strong = true;
$n = 0;
do{
$n = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes, $strong)));
}
while($n < $min || $n > $max);
return $n * $status;
}
else{
return mt_rand($min, $max) * $status;
}
}
答案 1 :(得分:0)
如果你需要从-x到+ y生成数字,你可以简单地生成4字节的uint,并且:
$number = ($generated % ($x + $y + 1)) - $x