mt_rand有什么缺点?
什么是偏见的定义:
当超过2 ^ 32时, mt_rand()返回值的分布偏向于PHP的64位版本中的偶数。
如果这是四舍五入的规则中所expression的那种偏见,我不认为它真的很重要(因为偏见并不是真正可见的)。
除了mt_rand()
声称是rand()
四倍,只需要在前面添加三个字符!
假设mt_rand
可用,使用它有什么缺点?
mt_rand
使用Mersenne Twisteralgorithm,这比rand
通常使用的LCG要好得多。 例如,一个LCG的周期是一个可怜的2 32 ,而mt_rand的周期是2 19937 – 1。此外,由LCG产生的所有值将位于线或平面绘制成多维空间。 此外,它不仅实际可行,而且相对容易确定LCG的参数。 LCG所具有的唯一优势是可能稍微快一些,但是在使用php编码时完全不相关。
但是, mt_rand
不适用于encryption目的 (令牌,密码或encryption密钥的生成)。
如果您需要密码随机性, random_int
在php 7中使用random_int
。对于较早的php版本,请在符合POSIX的操作系统上从/dev/urandom
或/dev/random
读取。
您所引用的分布怪癖只有在您生成的随机数范围大于2 ^ 32时才有意义。 那是4294967296。
如果你使用的数字很大,而且你需要将它们随机化,那么这也许是使用mt_rand()
重新考虑的一个原因。 但是,如果你使用的数字小于这个数字,那么这是无关紧要的。
它发生的原因是由于随机数发生器的精度在这些高范围内不够好。
我从来没有使用过大的随机数字,所以我从来没有必要担心。
rand()
和mt_rand()
之间的区别比“只有三个额外的字符”要多得多。 它们是完全不同的函数调用,并以完全不同的方式工作。 就像你不希望print()
和print_r()
是相似的。
mt_rand()
从它用来生成随机数的“Mersene Twister”algorithm中得到它的名字。 这个algorithm被认为是一个快速,高效和高质量的随机数发生器,这就是为什么在PHP中可用。
较旧的rand()
函数通过进行系统调用来使用操作系统的随机数生成器。 这意味着它使用任何随机数生成器恰好是您正在使用的操作系统上的默认值。 一般来说,默认的随机数生成器使用了一个慢得多的老algorithm,因此声称my_rand()
更快,但是会随着系统的不同而变化。
因此,对于几乎所有的用途, mt_rand()
比rand()
更适合使用。
你说“假设mt_rand()
是可用的”,但是它总是会被引入到PHP4中。