我正在尝试生成唯一令牌ID,我可以使用mt_rand()
吗?
mt_rand()
会两次生成相同的数字吗?
答案 0 :(得分:12)
答案 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)