使用真随机数播种mt_rand是否也使mt_rand的结果真正随机?

时间:2012-08-04 16:59:38

标签: php math

如果我有一个真正的随机数,并且在使用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个整数吗?

2 个答案:

答案 0 :(得分:1)

没有。 Mersenne twisters 总是伪随机。种子只决定它开始的顺序在哪里。

答案 1 :(得分: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()调用生成的值来暴露函数的状态。