1

我正在搞乱一些代码来使用 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 调用来决定一个数字是正数还是负数,但我不确定这是否是最好的方法。

4

2 回答 2

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;
    }
}
于 2013-05-10T08:58:34.463 回答
0

如果需要生成从 -x 到 +y 的数字,可以简单地生成 4 字节的 uint,并且:

$number = ($generated % ($x + $y + 1)) - $x
于 2013-05-10T09:00:55.033 回答