1

如果我有一个真正的随机数,并且在使用 mt_rand 之前使用 mt_srand 用真正的随机数播种 mt_rand,这是否意味着 mt_rand 的结果现在也是真正随机的而不是伪随机的?

换句话说,下面的代码是否会在给定的最小值和最大值之间产生一个真正的随机整数

function RandomInteger($min, $max)
{
    $trueRandomNumber = GetTrueRandomNumber();

    mt_srand($trueRandomNumber);
    return mt_rand($min, $max);
}

其次,用于播种 mt_srand 的真正随机数应该是 32 个整数吗?

4

2 回答 2

1

查看您的代码,我的猜测是您从 GetTrueRandomNumber() 获得了一些值(缺少代码),但是您希望该数字处于特定的值范围内。因此,您正在获取该输出并将其输入到 mt_rand() 中,因为它具有在特定范围内生成数字的方法。

虽然不是直接回答您的问题,但更好的解决方案是首先找出您想要的值的范围(即,如果输入 $min 是 0 并且 $max 是 $max - $min)。然后,找出获得该范围内的值所需的最大位数。然后,从 GetTrueRandomNumber() 的输出中提取该位数。如果值在范围内,则返回数字 + 原始 $min 值。如果该值不在范围内,则获取更多位数据。关键是扔掉比特,直到你得到一些在所需范围内。

如果需要示例源代码,请尝试:

http://barebonescms.com/documentation/csprng/

你应该能够把类似的东西放在一起。我会警惕将 mt_rand() 用于类似的事情,但在这个非常具体的情况下可能没问题。这取决于你打算用它做什么。它还很大程度上取决于 Mersenne Twister 的第一个数字的实际分布情况。我认为没有人在这方面做过任何工作。MT 旨在被播种一次 - 谁知道重复播种它的分布模式是什么。此外,如果其他代码使用 mt_rand(),您可能会根据以后的 mt_rand() 调用可能生成的值来暴露函数的状态。

于 2012-08-05T15:24:01.023 回答
1

不,梅森捻线总是伪随机的。种子仅确定它在序列中的哪个位置开始。

于 2012-08-04T17:07:26.283 回答