mt_rand()两次生成相同的数字吗?

时间:2014-09-19 10:38:53

标签: php random mersenne-twister

我正在尝试生成唯一令牌ID,我可以使用mt_rand()吗?

mt_rand()会两次生成相同的数字吗?

4 个答案:

答案 0 :(得分:12)

这是我第一次回答问题with just a comic,只是因为这是正确答案:

enter image description here

The original on Dilbert.com

答案 1 :(得分:2)

mt_rand将生成两次相同的数字,是的。每个随机数生成器可能最终会这样做。 (理论上)每次运行发生器时,每个数字都有相同的生成机会。 可以连续多次随机生成相同的数字。这是随机的。

要将随机数生成器用于唯一ID,两次生成相同数字的概率必须低到在实践中无关紧要。在这方面,mt_rand可能还不够。随机生成的唯一ID的概念已经形式化为UUIDs,您应该将其用于通用唯一ID 的目的。

选择this quote

  

......在未来100年内每秒产生10亿UUID之后,只创造一个副本的概率约为50%。

由于mt_rand在32位系统上返回32位整数,因此它只能返回2 ^ 32个唯一值,这仅为4,294,967,296个唯一值。如果您每秒产生十亿mt_rand个值,那么您在4秒后基本上保证重复。这有望说明UUID与mt_rand之间的比例差异及其重要性。即使你每秒产生少于10亿个ID,你仍然需要选择一种算法,这种算法几乎不可能发生碰撞,而不仅仅是不可能。

答案 2 :(得分:0)

mt_rand()会在每次通话时返回一个随机数。

但最终,它会返回已经返回给你的数字。这是因为,与随机性的期望统计特性一致,发生器具有有限(尽管对于Mersenne Twister,非常大)周期性。如果这种行为是不合需要的,那么最好的办法就是使用该生成器来混合一个唯一的集合。

答案 3 :(得分:0)

mt_rand()有以下注意事项:

  

警告:此功能不会生成加密安全   值,不应用于加密目的。如果你需要   加密安全值,请考虑使用   openssl_random_pseudo_bytes()代替。

  

警告:mt_rand()返回值的分布偏向于   当max超过2 ^ 32时,在64位PHP上构建偶数。

如果你对它没有完全不偏不倚,你应该没问题。

但是,如果是这种情况,为什么不使用uniqid