更好的随机生成PHP

时间:2020-03-05 18:38:32  来源:igfitidea点击:

我知道,如果我们知道自己在做什么并且可以访问服务器,那么仅使用rand()是可以预见的。

我有一个项目高度依赖于选择尽可能不可预测的随机数。因此,我正在寻找可以生成更好的随机数的其他内置函数或者用户函数的建议。

我用它做了一些测试:

$i = 0;

while($i < 10000){
    $rand = rand(0, 100);

    if(!isset($array[$rand])){
        $array[$rand] = 1;
    } else {
        $array[$rand]++;
    }

    sort($array);
    $i++;
}

我发现结果是均匀分布的,每个数字生成的次数有一个奇怪的规律。

解决方案

回答

@KG的变化,使用自EPOCH以来的毫秒数作为rand的种子?

回答

添加,相乘或者截断不良的随机源将给我们不良的随机结果。有关说明,请参见随机性和随机数简介。

我们对PHP rand()函数是正确的。引人注目的插图,请参见统计分析的第二个图。 (第一个数字引人注目,但它是由Scott Adams绘制的,未使用rand()绘制)。

一种解决方案是使用真正的随机生成器,例如random.org。另一个,如果我们使用的是Linux / BSD / etc。是使用/ dev / random。如果随机性是关键任务,则必须使用硬件随机数生成器。

回答

random.org有一个我们可以通过HTTP访问的API。

RANDOM.ORG is a true random number service that generates randomness
  via atmospheric noise.

回答

我会对随机性的印象保持警惕:在许多实验中,人们会选择随机性较低的分布。似乎头脑不是很擅长产生或者估计随机性。

在Fourmilab上有很多关于随机性的文章,包括另一个真正的随机发生器。也许我们可以从两个站点获取随机数据,所以如果一个站点出现故障,我们仍然可以拥有另一个站点。

Fourmilab还提供了一个测试程序来检查随机性。我们可以使用它来检查各种myRand()程序。

至于最后一个程序,如果生成10000个值,为什么不从10000个中选择最终值呢?我们将自己限制为一个子集。此外,如果$ min和$ max大于10000,则将无法使用。

无论如何,我们需要的随机性取决于应用程序。 rand()对于在线游戏来说是可以的,但对于密码术来说则是不可行的(任何未经统计程序进行彻底测试的东西无论如何都不适合于密码学)。你是法官!