mt_rand有什么缺点?

Pac*_*ier 26 php random rounding

偏见的定义是什么:

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

如果这是在四舍五入的替代打破规则中所述的那种偏见,我认为这不重要(因为偏见不是真的可见).

除了mt_rand()宣称是比快四倍rand(),只是在前面增加3个字符!

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

phi*_*hag 57

mt_rand使用Mersenne Twister算法,该算法远优于通常使用的LCGrand.例如,LCG的周期是2 32,而mt_rand的周期是2 19937-1.此外,当绘制成多维空间时,LCG生成的所有值将位于线或平面上.而且,它不仅实际可行,而且相对容易确定LCG的参数.LCG具有的唯一优势可能是稍微快一些,但在PHP编码时完全不相关的规模.

但是,mt_rand不适合加密的目的(生成令牌,口令或加密密钥)任一.

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

  • 为了直观地表示差异:[link](http://tjl.co/blog/code/followup-php-rand-vs-mt_rand/) (13认同)
  • 值得注意的是,`openssl_random_pseudo_bytes()`仅适用于PHP 5.3.(确保你使用最新的php版本的另一个好理由) (3认同)

Spu*_*ley 8

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

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

它发生的原因是由于随机数发生器的精度在那些高范围内不够好.

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

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

mt_rand()从用于生成随机数的"Mersene Twister"算法中获取它的名称.已知该算法是快速,有效和高质量的随机数生成器,这就是它在PHP中可用的原因.

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

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

你说"假设mt_rand()可用",但它总是会在PHP4中引入.