【问题标题】:How works PHP Rand() function?PHP Rand() 函数如何工作?
【发布时间】:2018-10-20 22:53:26
【问题描述】:

我想知道 PHP Rand() 函数是如何工作的?我是说;这个函数如何在没有任何规则或任何其他随机化函数的情况下随机化数字?

例如我有一个这样的数组:

$numbers = array(0,1,2,3,4,5,6,7,8,9);

那么我如何在没有 rand()、array_rand() 等的情况下随机化这些数字。

基本问题是:

随机函数的工作原理是什么?

【问题讨论】:

  • 你应该阅读维基百科的文章:Pseudorandom number generator
  • 如手册中所述:“rand — 通过 Mersenne Twister 随机数生成器生成随机值”
  • 你的两个问题相互矛盾...谁说rand()函数的PHP实现不使用底层OS特性,所以另一个函数?这与如何不使用使用该函数生成随机数的问题有什么关系?
  • 如果你要 RYO,你不妨正确地做,并通过使用自然熵源使其真正随机;也许是太阳辐射,或者是死无线电频率上的白噪声(我认为 random.org 使用)......甚至已经完成了熔岩灯。 :)

标签: php arrays function random


【解决方案1】:

PHP rand() 和所有psuedo-random number generators 一样,不会生成真正的随机数据,而是使用一些数学函数来创建看似随机的数据。

方法可能不同,但基本原理是这样的:

我们将初始值作为“种子”s。 (这可能是当前时间,用户输入的“随机”值,甚至是从一些entropy source 中获取的真正随机熵)

然后我们使用s 并应用一个函数f,产生一个新值s' (s-prime)(这个函数通常是一个模函数或散列函数)

然后我们可以无限重复这个过程,将s' 放入f 生成s'',等等。

f 的这一系列结果是我们的“随机”数字。

但是,希望您意识到,f 保持不变,并且在给定相同输入的情况下始终会产生相同的输出。

因此,如果我们给它相同的起始种子s,我们将始终得到相同的序列s',s'',s'''...

这就是我们随机称它们为“Psuedo”的原因。如果你不知道起始种子并且不观察序列太久,它似乎是随机的。但如果我们知道使用的函数f 和起始种子s,我们就可以预测rand() 会产生的每个值。

【讨论】:

  • 本文补充一些有趣的信息cod.ifies.com/2008/05/…
  • f 函数是如何定义的?什么影响它?
  • @RezaS,有很多可能的实现。本质上,基于数学证明/实验为f 选择了一种算法,以便我们知道我们的函数根据输入提供了足够“随机”的结果。 (当然它实际上并不是随机的,相同的输入会导致相同的输出) Mersenne Twister 是一种非常流行的实现:en.wikipedia.org/wiki/Mersenne_Twister
  • @Kallmanation 谢谢,我研究了 PHP 的源代码并找到了可能的实现:github.com/php/php-src/blob/PHP-7.0.33/ext/standard/rand.c
【解决方案2】:

通常,它取决于基于毫秒数甚至纳秒数的时间。我们可以将种子数与某个固定值相乘以获得特定的回报,大多数情况下在 0 和 1 之间 例如:考虑到 numberis 是秒的种子。

numberi+1 = (a * numberi + c) mod m

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多