我在留言板上看过它 - Random
类并不是随机的。它是使用数学公式以可预测的方式创建的。
这是真的吗?如果是这样,Random
并不是真的随意吗?
答案 0 :(得分:5)
因为确定性计算机本身很难生成“真正的”随机数。
此外,可预测/可重复的随机序列通常非常有用,因为它有助于测试。
答案 1 :(得分:5)
创建绝对随机的东西真的很难。请参阅randomness和pseudo-randomness
上的维基百科文章答案 2 :(得分:4)
正如其他人已经说过的,Random会根据某些种子值创建伪随机数。知道.NET类Random
有两个构造函数可能会有所帮助:
Random(int Seed)
创建一个具有给定种子值的随机数生成器,如果您希望程序具有可重现的行为,则会很有帮助。另一方面,
Random()
创建一个带有日期时间取决于种子值的随机数生成器,这意味着,几乎每次再次启动程序时,它都会生成不同的(伪)随机数序列。
答案 3 :(得分:2)
每个起始种子的序列是可预测的。对于不同的种子,返回不同的数字序列。如果使用的种子本身是随机的(例如DatetTime.Now.Ticks),则数字返回的是“随机”。
或者,您可以使用加密随机数生成器,例如RNGCryptoServiceProvider类。
答案 4 :(得分:2)
它不是随机的,它是一个类似随机的数字生成算法,它基于一个数字来生成。如果您将该随机数设置为类似于系统时间的数字,则数字更接近于随机,但如果您使用这些数字来表示加密算法,则攻击者知道您生成随机数和您使用的算法时,那么你的加密就有可能破裂。
生成真正的随机数的唯一方法是测量一些自然的东西,例如电压电平或让麦克风在某处或类似的地方拾取声音。
答案 5 :(得分:1)
确实如此,但你可以随时为随机数生成器提供一些时间依赖值,或者如果你真的准备推出这艘船,请查看www.random.org ...
在Random类的情况下,我认为对于大多数要求它应该是随机的...我看不到实际播种它的方法,所以我猜它必须自动播种为内置行为...