PHP rand和mt_rand的区别?

256 5月之前 PHP 随机

答案

这两个函数都是用于产生随机数,都有两种语法:

  1. int rand(void):产生0getrandmax()之间的随机数
  2. int mt_rand(void):产生0到mt_getrandmax()之间的随机数
  3. int rand(int $min, int $max):产生从$min$max之间的随机数
  4. int mt_rand($min, $max):产生从$min$max之间的随机数

mt_rand()使用梅森旋转算法中已知的特性作为随机发生器,rand()使用 libc 中未知的特性作为随机发生器,所以:

  • mt_rand()生成更好的随机数。
  • mt_rand()性能上比rand()快4倍

答案解析

梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。由松本真和西村拓士在1997年开发,基于有限二进制字段上的矩阵线性递归 F2。可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。

Mersenne Twister这个名字来自周期长度取自梅森素数的这样一个事实。这个算法通常使用两个相近的变体,不同之处在于使用了不同的梅森素数。一个更新的和更常用的是MT19937, 32位字长。还有一个变种是64位版的MT19937-64。对于一个k位的长度,Mersenne Twister会在 [0,2k-1]的区间之间生成离散型均匀分布的随机数。