4

随机数函数的目的是得到——你猜对了——一个随机数,你无法预测(或者很难确定地预测)。如果mt_rand()函数比旧的更快且更不可预测(更“随机”)rand(),为什么不将底层实现切换到新方法呢?

换句话说,rand()如果/因为底层实现发生了变化,使用什么样的程序会在更高版本的 PHP 中中断?

4

3 回答 3

6

主要是因为那是PHP 方式。就像他们添加mysql_real_escape_string而不是替换mysql_escape_string它一样。

但是,它也可能与 mersenne-twister 算法的缺点有关(我不知道它们是否也存在于rand()算法中):

本机形式的算法不适用于密码学(与 Blum Blum Shub 不同)。观察足够数量的迭代(在 MT19937 的情况下为 624,因为这个数字是产生未来迭代的状态向量的大小)允许人们预测所有未来的迭代。Makoto Matsumoto 等人提出了一对基于 Mersenne twister 输出的密码流密码。作者声称在计数器模式下速度比高级加密标准快 1.5 到 2 倍。维基百科

另一个问题是,将非随机初始状态(特别是存在许多零)转换为通过随机性测试的输出可能需要很长时间。小型滞后 Fibonacci 生成器或线性同余生成器启动得更快,通常用于为 Mersenne Twister 播种随机初始值。维基百科

于 2012-07-17T17:52:46.027 回答
3

两种算法都是伪随机的。这意味着知道初始条件可以知道所有未来的迭代。不可能知道有人是否依赖于这样的实现细节(即依赖于函数的实现而不是函数的意图),因此创建一个新函数更安全。

于 2012-07-17T17:59:16.907 回答
-1

最后从 PHP 7.1 开始,两者rand()mt_rand()是相同的功能。

于 2019-11-02T13:08:47.827 回答