【问题标题】:Does mt_rand() generate same number twice?mt_rand() 是否两次生成相同的数字?
【发布时间】:2014-11-13 22:28:04
【问题描述】:

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

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

【问题讨论】:

    标签: php random mersenne-twister


    【解决方案1】:

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

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

    this quote:

    ...仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。

    由于mt_rand 在 32 位系统上返回一个 32 位整数,它只能返回 2^32 个唯一值,也就是只有 4,294,967,296 个唯一值。如果您每秒生成 10 亿个 mt_rand 值,那么您基本上保证在 4 秒后重复。这有望说明 UUID 和 mt_rand 之间的规模差异以及为什么这很重要。即使您每秒生成的 id 远少于 10 亿个,您仍然需要选择一种算法,使碰撞几乎不可能发生,而不仅仅是不太可能发生。

    【讨论】:

    • ...对于 PHP,有一个非常好的函数可以做到这一点:php.net/uniqid
    • @Omkar uniqid 不是一个 UUID 实现!不是很好!
    • @JeroenvandenBroek 对不起,不。
    • @deceze 生成唯一 ID 会更好吗?
    • @deceze 和使用mt_rand()有什么不同?
    【解决方案2】:

    mt_rand() 有以下注意事项:

    注意:此函数不会生成加密安全 值,不应用于加密目的。如果你需要 一个密码安全的值,考虑使用 openssl_random_pseudo_bytes() 代替。

    注意:mt_rand() 返回值的分布偏向 当最大值超过 2^32 时,PHP 的 64 位版本的偶数。

    如果你对它不是完全不偏不倚感到满意,你应该没问题。

    但是,如果是这样,你为什么不使用uniqid

    【讨论】:

      【解决方案3】:

      mt_rand() 将在每次调用时返回一个随机数。

      但最终,它会返回已经返回给您的数字。这是因为,除了与所需的随机性统计特性一致外,生成器还具有有限的(尽管对于 Mersenne Twister,非常大)周期性。如果这种行为是不可取的,那么最好的办法是使用该生成器来洗牌一个独特的集合。

      【讨论】:

        【解决方案4】:

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

        The original on Dilbert.com.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-29
          • 2019-12-04
          • 1970-01-01
          • 1970-01-01
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 2012-06-21
          相关资源
          最近更新 更多