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

如何生成随机数。 诸如java等语言如何生成随机数,尤其是如何为GUID完成。 我发现像Pseudorandomnumber生成器这样的算法使用初始值。

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

第一:如果保证数字永远不会重复,那就不是很随机了。

第二:有很多PRNG算法 。

更新:

第三: UUID有一个IETF RFC (MS调用GUID),但你应该认识到(U | G)UID在加密方面是不安全的,如果你担心的话。

更新2:

如果你想在生产代码中实际使用这样的东西(不只是为了你自己的启发), 使用预先存在的库。 如果你之前从未做过(或者即使你有),那么这种代码几乎可以保证在其中有微妙的错误。

更新3:

这是.NET的GUID的文档

有很多方法可以生成随机数。 它通常使用系统/库调用完成,该调用使用带有种子的伪数生成器,如您所述。

但是,还有其他方法可以获得随机数,这些方法涉及专用硬件以获得真正的随机数。 我知道一些使用这种硬件的扑克网站 。 阅读他们如何做到这一点非常有趣。

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

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

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

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

特别是关于Java:

  • java.util.Random使用线性同余生成器 ,这不是很好
  • java.util.UUID#randomUUID()使用java.security.SecureRandom ,这是一个用于各种加密安全RNG的接口 – 我相信默认基于SHA-1。
  • UUID / GUID不一定是随机的
  • 在网上找到比java.util.Random好得多的RNG实现很容易,例如Mersenne Twister或乘法携带

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

[编辑]

如果使用RNGCryptoServiceProvider生成相当长的字节数,它可能是唯一的,但没有保证。 理论上,真正的随机数并不意味着是唯一的。 你掷了两次骰子,你可能会同时得到头,但它们仍然是随机的。 真正的随机!

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