为什么Random class不是真的随机?

时间:2010-03-25 08:55:59

标签: random

我在留言板上看过它 - Random类并不是随机的。它是使用数学公式以可预测的方式创建的。

这是真的吗?如果是这样,Random并不是真的随意吗?

6 个答案:

答案 0 :(得分:5)

因为确定性计算机本身很难生成“真正的”随机数。

此外,可预测/可重复的随机序列通常非常有用,因为它有助于测试。

答案 1 :(得分:5)

创建绝对随机的东西真的很难。请参阅randomnesspseudo-randomness

上的维基百科文章

答案 2 :(得分:4)

正如其他人已经说过的,Random会根据某些种子值创建伪随机数。知道.NET类Random有两个构造函数可能会有所帮助:

 Random(int Seed)

创建一个具有给定种子值的随机数生成器,如果您希望程序具有可重现的行为,则会很有帮助。另一方面,

 Random()

创建一个带有日期时间取决于种子值的随机数生成器,这意味着,几乎每次再次启动程序时,它都会生成不同的(伪)随机数序列。

答案 3 :(得分:2)

每个起始种子的序列是可预测的。对于不同的种子,返回不同的数字序列。如果使用的种子本身是随机的(例如DatetTime.Now.Ticks),则数字返回的是“随机”。

或者,您可以使用加密随机数生成器,例如RNGCryptoServiceProvider类。

答案 4 :(得分:2)

它不是随机的,它是一个类似随机的数字生成算法,它基于一个数字来生成。如果您将该随机数设置为类似于系统时间的数字,则数字更接近于随机,但如果您使用这些数字来表示加密算法,则攻击者知道您生成随机数和您使用的算法时,那么你的加密就有可能破裂。

生成真正的随机数的唯一方法是测量一些自然的东西,例如电压电平或让麦克风在某处或类似的地方拾取声音。

答案 5 :(得分:1)

确实如此,但你可以随时为随机数生成器提供一些时间依赖值,或者如果你真的准备推出这艘船,请查看www.random.org ...

在Random类的情况下,我认为对于大多数要求它应该是随机的...我看不到实际播种它的方法,所以我猜它必须自动播种为内置行为...