繁体   English   中英

如何生成“随机”数和“唯一”数?

[英]How to generate “random” but also “unique” numbers?

如何生成随机数? Java之类的语言如何生成随机数,尤其是对于GUID如何完成? 我发现像Pseudorandomnumber生成器这样的算法使用初始值。

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

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

第二: PRNG算法很多。

更新:

第三:存在用于UUIDIETF RFC (MS称为GUID),但是如果您担心,那么(U | G)UID 并不是加密安全的。

更新2:

如果您想在生产代码中实际使用这样的内容(不仅用于您自己的教育), 使用预先存在的库。 如果您以前从未(或者即使有)从未做过这种代码,那么几乎可以保证其中包含细微的错误。

更新3:

这是.NET GUID文档

有很多方法可以生成随机数。 通常,这是通过系统/库调用来完成的,该调用使用了带有种子的伪数字生成器,正如您已经描述过的。

但是,还有其他获取随机数的方法,其中涉及专门的硬件以获取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。
  • UUID / GUID不一定是随机的
  • 在网上可以轻松找到比java.util.Random更好的RNG实现,例如Mersenne Twister或带乘数

我了解您正在寻找一种使用C#生成随机数的方法。 如果是,则寻找RNGCryptoServiceProvider

[编辑]

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

我猜想应用唯一性检查,您只需推出自己的机制即可保留先前生成的数字的历史记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM