使用随机时是否应该避免使用种子?

时间:2014-02-06 23:39:17

标签: .net random

在.NET中使用System.Random并为其提供种子时,是否应该避免使用一些种子?我问,因为我喜欢在运行仿真计算时注入一个已知的种子,以便我可以在以后需要时复制结果。然而,随机数生成器的基础功能是周期性的,周期取决于种子,所以我想知道是否有特定的System.Random实现的警告,并且作为奖励,如果有人知道它使用什么功能封面后面。

注意:我知道System.Random不是高质量的RNG,我应该使用其他东西进行严肃的模拟。这个问题严格关于System.Random及其实现。

2 个答案:

答案 0 :(得分:3)

我怀疑种子会比其他种子更短的一般规则。较大的数字不能保证更长的时间,而像0这样的数字不一定会有短时​​间。

来自MSDN Documentation

  

Random类的当前实现基于Donald E. Knuth的减法随机数生成器算法。有关更多信息,请参阅D. E. Knuth。 “计算机编程的艺术,第2卷:半数值算法”。 Addison-Wesley,Reading,MA,第二版,1981年。

还有Microsoft Connect thread关于算法实现中的错误。显然,.NET代码中存在拼写错误。其中一位.NET软件工程师评论道:

  

确实,[随机实现]存在一个真正的问题。

     

我们已经在团队内部和我们的一些合作伙伴讨论过这个问题,并得出结论,遗憾的是我们现在无法解决问题。原因是一些应用程序依赖于以下事实:当使用相同种子初始化时,生成器产生相同的伪随机序列。即使变更为好,但一旦迁移到“固定”版本,它将破坏做出此假设的应用程序。

答案 1 :(得分:1)

几点 -

  1. 我不认为众所周知的PRNG的周期性取决于种子。我相信在实施过程中会解决这个问题

  2. 然而,不良的播种可能导致看似非随机值的长序列,请参阅Disadvantages of Mersenne Twister

  3. 以上几点非常重要,因为.NET实现将来可能会发生变化