如何生成“随机”但也是“唯一”数字?

时间:2009-05-26 10:24:28

标签: c# random

如何生成随机数。诸如java等语言如何生成随机数,尤其是如何为GUID完成。我发现像Pseudorandomnumber生成器这样的算法使用初始值。

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

6 个答案:

答案 0 :(得分:18)

首先:如果保证数字永远不会重复,则不是很随机。

第二:有很多PRNG algorithms

更新:

第三:有一个IETF RFC for UUIDs(MS调用GUID),但你应该认识到(U | G)UID 加密安全,如果你担心的话。

更新2:

如果您想在生产代码中实际使用此类内容(不仅仅是为了您自己的启发)使用预先存在的库。如果您以前从未做过(或者即使您已经完成),这种代码几乎可以保证在其中有微妙的错误。

更新3:

这是docs for .NET's GUID

答案 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:

答案 5 :(得分:0)

我知道您正在寻找一种使用C#生成随机数的方法。如果是,RNGCryptoServiceProvider就是你要找的。

[编辑]

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

我想要应用唯一的检查,你只需要推出自己的机制来保存以前生成的数字的历史记录。