mt_rand的缺点是什么?

2022-08-30 16:24:46

偏见的定义是什么:

当 max 超过 2^32 时,mt_rand() 返回值的分布偏向于 PHP 的 64 位版本上的偶数。

如果这是舍入的替代平局打破规则中陈述的那种偏见,我认为这并不重要(因为偏见并不真正可见)。

此外,据称比快四倍,只需在前面添加三个字符!mt_rand()rand()

假设可用,使用它的缺点是什么?mt_rand


答案 1

mt_rand使用 Mersenne Twister 算法,该算法远优于 通常使用的 LCG。例如,LCG的周期是可怜的232,而mt_rand的周期是219937 − 1。此外,当绘制到多维空间中时,LCG 生成的所有值都将位于直线或平面上。此外,它不仅实际可行,而且相对容易确定LCG的参数。LCG的唯一优点是可能稍微快一点,但是在用php编码时,其规模完全无关紧要。rand

但是,也不适合用于加密目的(生成令牌,密码或加密密钥)。mt_rand

如果你需要加密随机性,请在 php 7 中使用 random_int。在较旧的 php 版本上,从符合 POSIX 的操作系统读取或在符合 POSIX 的操作系统上读取。/dev/urandom/dev/random


答案 2

您引用的分布怪癖仅在您生成的随机数范围大于 2^32 时才相关。这是4294967296。

如果您正在处理这么大的数字,并且需要将它们随机化,那么也许这是重新考虑使用.但是,如果您使用小于此值的数字,则无关紧要。mt_rand()

发生这种情况的原因是由于随机数生成器的精度在这些高范围内不够好。

我从来没有使用过这么大的随机数,所以我从来不需要担心它。

和之间的区别远远超过“只是三个额外的字符”。它们是完全不同的函数调用,并且以完全不同的方式工作。就像你意想不到的一样,并且相似。rand()mt_rand()print()print_r()

mt_rand()它的名字来自它用来生成随机数的“Mersene Twister”算法。众所周知,该算法是一个快速,高效和高质量的随机数生成器,这就是为什么它可以在PHP中使用的原因。

较旧的函数通过进行系统调用来利用操作系统的随机数生成器。这意味着它使用任何随机数生成器恰好是您正在使用的操作系统上的默认值。通常,默认的随机数生成器使用更慢和较旧的算法,因此声称更快,但它会因系统而异。rand()my_rand()

因此,对于几乎所有用途,使用的功能都比 .mt_rand()rand()

你说“假设可用”,但它总是会从PHP4中引入以来一直存在。mt_rand()


推荐