随机数是如何生成的?像Java等语言如何生成随机数,特别是GUIDs是如何生成的?我发现伪随机数生成器等算法使用初始值。
但我需要创建一个随机数程序,其中一旦出现的数字即使系统重新启动也不会重复。我认为我需要在任何地方存储这些值,以便我可以检查数字是否重复,但如果列表超过限制,这将变得太复杂了。
随机数是如何生成的?像Java等语言如何生成随机数,特别是GUIDs是如何生成的?我发现伪随机数生成器等算法使用初始值。
但我需要创建一个随机数程序,其中一旦出现的数字即使系统重新启动也不会重复。我认为我需要在任何地方存储这些值,以便我可以检查数字是否重复,但如果列表超过限制,这将变得太复杂了。
首先:如果一个数字保证永远不会重复,那么它并不是很随机。
其次:有很多 PRNG算法。
更新:
第三:有一个IETF RFC关于UUID(MS称为GUID),但如果您担心安全性,请注意(U|G)UID不是加密安全的。
更新2:
如果您想在生产代码中实际使用这样的东西(而不仅仅是为了自己的启示),请使用现成的库。如果您以前从未做过这样的事情(甚至如果您已经做过了),那么这种代码几乎肯定会出现微妙的错误。
更新3:
这里是.NET GUID文档。
有很多方法可以生成随机数。通常使用带有种子的伪随机数生成器进行系统/库调用来完成。
但是,还有其他获取随机数的方法,涉及使用专用硬件获取真正的随机数。我知道一些扑克网站使用这种硬件。阅读他们如何做到这一点非常有趣。
关于Java编程语言的具体内容:
java.util.Random
使用线性同余生成器,这种方法不太好java.util.UUID#randomUUID()
使用java.security.SecureRandom
,这是一种接口,用于各种加密安全的随机数生成器 - 默认情况下基于SHA-1算法。java.util.Random
更好的随机数生成器实现,例如Mersenne Twister或multiply-with-carry我了解您正在寻找使用C#生成随机数的方法。如果是的话,RNGCryptoServiceProvider就是您要找的。
[编辑]
如果您使用RNGCryptoServiceProvider生成足够长的字节数,它很可能是唯一的,但并不保证。理论上,真正的随机数并不意味着唯一。您掷两次骰子,可能两次都是正面,但它们仍然是随机的。真正的随机!
我想要应用唯一性检查,您只需要自己设计一个机制来记录先前生成的数字的历史记录即可。