代码之家  ›  专栏  ›  技术社区  ›  SyncMaster

如何生成“随机”但又是“唯一”的数字?

  •  11
  • SyncMaster  · 技术社区  · 15 年前

    如何生成随机数?Java等语言是如何产生随机数的,特别是它是如何做GUID的?我发现像伪随机数生成器这样的算法使用初始值。

    但是我需要创建一个随机数程序,在这个程序中,一个曾经发生过的数字不应该重复,即使系统重新启动等等。我认为我需要将这些值存储在任何地方,这样我就可以检查这个数字是否重复,但是当列表超出限制时,它会变得太复杂。

    6 回复  |  直到 15 年前
        1
  •  18
  •   Hank Gay    15 年前

    第一:如果这个数字保证永远不会重复,它就不是很随机的。

    第二:有很多 PRNG algorithms .

    更新:

    第三:有一个 IETF RFC for UUIDs (微软称之为guid),但你应该认识到(u_g)uids是 密码安全,如果你担心的话。

    更新2:

    如果您想在生产代码中实际使用类似的东西(不仅仅是为了您自己的启发) 拜托 使用预先存在的库。这类代码几乎可以保证,如果您以前从未做过(或者即使您做过),其中会有一些细微的错误。

    更新3:

    这里是 docs for .NET's GUID

        2
  •  3
  •   Pablo Santa Cruz    15 年前

    有很多方法可以生成随机数。这通常是通过一个系统/库调用来完成的,该调用使用一个带有种子的伪数字生成器,正如您已经描述的那样。

    但是,还有其他方法可以获得随机数,这些方法需要专门的硬件来获得真正的随机数。我知道一些 poker sites 使用这种硬件。读他们是怎么做的很有趣。

        3
  •  0
  •   Toon Krijthe    15 年前

    大多数随机数生成器都有一种“随机”重新初始化种子值的方法。(有时称为随机化)。

    如果不可能,您也可以使用系统时钟初始化种子。

        4
  •  0
  •   thijs    15 年前

    您可以使用此代码示例: http://xkcd.com/221/ 或者,您可以使用本书: http://www.amazon.com/Million-Random-Digits-Normal-Deviates/dp/0833030477

    但是说真的,不要自己实现它,使用现有的库。你不能是第一个这样做的人。

        5
  •  0
  •   Michael Borgwardt    15 年前

    特别是关于Java:

        6
  •  0
  •   Hemant    15 年前

    我知道你在寻找一种使用c生成随机数的方法。如果是的话, RNGCryptoServiceProvider 就是你要找的。

    [编辑]

    如果使用RNGCryptoServiceProvider生成相当长的字节数,那么它可能是唯一的,但没有担保。理论上,真正的随机数并不意味着是唯一的。你掷两次骰子,两次都能得到头像,但还是随机的。真随机!

    我想,要应用唯一性检查,您只需推出自己的机制来保存以前生成的数字的历史记录。