更好的随机生成PHP

我知道只要使用 rand()是可预测的,如果你知道你在做什么,并且有权访问服务器。

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

我用这个来做一个小测试:

$i = 0;

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

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

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

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

0
在php7中有一个新功能,完全符合你的需求
额外 作者 Salvador Dali,

6 答案

random.org has an API you can access via HTTP.

RANDOM.ORG是一个真正的随机数字服务,可以产生随机性   通过大气噪​​音。
0
额外

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

0
额外
Sooooo,对于今天的快速多核计算机,你有多次重复使用种子的可能性很大?冗长的红旗 - 你正在重新创造一个方形轮,甚至没有参数的 srand()会做更好的(“更随机”)工作。
额外 作者 Piskvor,

A new PHP7 there is a function that does exactly what you needed: it generates cryptographically secure pseudo-random integers.

int random_int ( int $min , int $max )
生成适合使用的加密随机整数   无偏见的结果非常重要(即洗牌扑克牌)。

有关PRNG和CSPRNG(及其差异)的更详细说明以及为什么您的原始方法实际上是一个坏主意,请阅读我的另一个非常相似的答案

0
额外

添加,乘数或截断可怜的随机数据源会给你一个糟糕的随机结果。有关解释,请参阅随机性和随机数简介

你对PHP rand()函数是正确的。请参阅统计分析中的第二张数字,以获得引人注目的说明。 (第一个数字很引人注目,但它是由斯科特亚当斯绘制的,而不是用rand()绘制的)。

一种解决方案是使用一个真正的随机生成器,例如 random.org 。另一个,如果你在Linux / BSD /等。是使用 / dev / random 。如果随机性对任务至关重要,则必须使用硬件随机生成器

0
额外

我会对随机性的印象保持警惕:已经有很多实验,人们会选择较不随机的分布。看起来思维不擅长产生或估计随机性。

Fourmilab 上有很多关于随机性的文章,包括另一篇真正的随机生成器。也许你可以从这两个网站获得随机数据,所以如果一个人失败了,你还有另一个人。

Fourmilab还提供测试计划来检查随机性。你可以用它来检查你的各种myRand()程序。

至于你的最后一个程序,如果你生成10000个值,为什么不选择一万个中的最终值?你限制自己的一个子集。另外,如果您的$ min和$ max大于10000,它将不起作用。

无论如何,你需要的随机性取决于你的应用程序。 rand()对于一个在线游戏是可以的,但对于密码学来说并不确定(任何没有用统计程序彻底测试过的东西都不适合密码学)。你是法官!

0
额外

获得随机数的另一种方法,概念上类似于获取UUID

PHP版本5.3及以上

openssl_random_pseudo_bytes(...)

或者,您可以使用RFC4122尝试以下图书馆

0
额外