如何生成随机数。诸如java等语言如何生成随机数,尤其是如何为GUID完成。我发现像Pseudorandomnumber生成器这样的算法使用初始值。
但是我需要创建一个随机数程序,其中一次发生的数字应该永远不会重复,即使系统重新启动等等。我认为我需要将值存储在任何地方,以便我可以检查数字是否重复或不是,但当列表超出限制时,它会太复杂。?
答案 0 :(得分:18)
首先:如果保证数字永远不会重复,则不是很随机。
第二:有很多PRNG algorithms。
更新:
第三:有一个IETF RFC for UUIDs(MS调用GUID),但你应该认识到(U | G)UID 不加密安全,如果你担心的话。
更新2:
如果您想在生产代码中实际使用此类内容(不仅仅是为了您自己的启发)请使用预先存在的库。如果您以前从未做过(或者即使您已经完成),这种代码几乎可以保证在其中有微妙的错误。
更新3:
答案 1 :(得分:3)
有很多方法可以生成随机数。它通常使用系统/库调用完成,该调用使用带有种子的伪数生成器,如您所述。
但是,还有其他方法可以获得随机数,这些方法涉及专用硬件以获得真正的随机数。我知道有些poker sites使用这种硬件。阅读它们是如何做的非常有趣。
答案 2 :(得分:0)
大多数随机数生成器都有一种“随机”重新初始化种子值的方法。 (有时称为随机化)。
如果不可能,您还可以使用系统时钟初始化种子。
答案 3 :(得分:0)
您可以使用此代码示例: http://xkcd.com/221/ 或者,您可以使用本书: http://www.amazon.com/Million-Random-Digits-Normal-Deviates/dp/0833030477
但严重的是,不要自己实现它,使用现有的库。你不可能是第一个这样做的人。
答案 4 :(得分:0)
特别关于Java:
java.util.Random
使用linear congruential generator,即not very good java.util.UUID#randomUUID()
使用java.security.SecureRandom
,这是一个用于各种加密安全RNG的接口 - 我相信默认基于SHA-1。 java.util.Random
好得多的RNG,例如Mersenne Twister或multiply-with-carry 答案 5 :(得分:0)
我知道您正在寻找一种使用C#生成随机数的方法。如果是,RNGCryptoServiceProvider就是你要找的。 p>
[编辑]
如果使用RNGCryptoServiceProvider生成相当长的字节数,它可能是唯一的,但没有保证。理论上,真正的随机数并不意味着是唯一的。你掷了两次骰子,你可能会两次得到头,但它们仍然是随机的。真正的随机!
我想要应用唯一的检查,你只需要推出自己的机制来保存以前生成的数字的历史记录。