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

我有一个项目高度依赖于选择尽可能不可预测的随机数。 所以我正在寻找可以产生更好的随机数的建议,无论是其他内置函数还是用户函数。

我用这个做了一点测试:

$i = 0;

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

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

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

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

===============>>#1 票数:21 已采纳

添加,乘以或截断不良随机源会给您带来较差的随机结果。 有关解释,请参阅随机数和随机数简介

你对PHP rand()函数是正确的。 有关引人注目的说明,请参见统计分析的第二个数字。 (第一个数字是引人注目的,但它是由斯科特·亚当斯绘制的,而不是用兰德()绘制的)。

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

===============>>#2 票数:5

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

RANDOM.ORG是一种真正的随机数服务,可通过大气噪​​声产生随机性。

===============>>#3 票数:4

我会对随机性的印象持谨慎态度:已经有很多实验,人们会选择较少的随机分布。 看起来心灵并不擅长产生或估计随机性。

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

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

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

无论如何,您需要的随机性取决于您的应用程序。 rand()对于在线游戏来说没问题,但对于加密技术来说还不行(任何未经统计程序彻底测试的东西都不适合加密)。 你是法官!

===============>>#4 票数:2

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

PHP 5.3及以上版本

openssl_random_pseudo_bytes(...)

或者您可以使用RFC4122尝试以下

===============>>#5 票数:2

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

===============>>#6 票数:1

一个新的PHP7有一个功能可以完全满足你的需要:它生成加密安全的伪随机整数。

int random_int ( int $min , int $max )

生成适用于无偏结果至关重要的加密随机整数(即改组扑克牌组)。

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

  ask by UnkwnTech translate from so

未解决问题?本站智能推荐: