如何生成“随机”但也是“唯一”数字?
如何生成随机数。 诸如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生成相当长的字节数,它可能是唯一的,但没有保证。 理论上,真正的随机数并不意味着是唯一的。 你掷了两次骰子,你可能会同时得到头,但它们仍然是随机的。 真正的随机!
我想应用唯一的检查,你只需要推出自己的机制来保存以前生成的数字的历史记录。