[英]How to generate “random” but also “unique” numbers?
如何生成随机数? Java之类的语言如何生成随机数,尤其是对于GUID如何完成? 我发现像Pseudorandomnumber生成器这样的算法使用初始值。
但是我需要创建一个随机数程序,在该程序中,即使系统重新启动等,一旦出现数字就永远不会重复。我认为我需要将值存储在任何地方,以便我可以检查数字是否重复,但是当列表超出限制时,它将太复杂。
有很多方法可以生成随机数。 通常,这是通过系统/库调用来完成的,该调用使用了带有种子的伪数字生成器,正如您已经描述过的。
但是,还有其他获取随机数的方法,其中涉及专门的硬件以获取TRUE随机数。 我知道一些使用这种硬件的扑克网站 。 阅读他们的操作方式非常有趣。
大多数随机数生成器都有一种方法可以“随机”地重新初始化种子值。 (有时称为随机化)。
如果那不可能,您还可以使用系统时钟来初始化种子。
您可以使用以下代码示例: 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。 java.util.Random
更好的RNG实现,例如Mersenne Twister或带乘数 我了解您正在寻找一种使用C#生成随机数的方法。 如果是,则寻找RNGCryptoServiceProvider 。
[编辑]
如果使用RNGCryptoServiceProvider生成相当长的字节数,则它可能是唯一的,但没有保证。 从理论上讲,真正的随机数并不意味着唯一。 你掷骰子2次,两次都可能得头,但它们仍然是随机的。 真正的随机!
我猜想应用唯一性检查,您只需推出自己的机制即可保留先前生成的数字的历史记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.