【问题标题】:How long does the stream of Random().Next() take until it repeats?Random().Next() 流在重复之前需要多长时间?
【发布时间】:2010-01-12 16:18:31
【问题描述】:

考虑 .NET Random 流:

var r = new Random(); 
while (true) 
{ 
    r.Next(); 
}

重复需要多长时间?

【问题讨论】:

  • 请详细说明“循环”?你的意思是它的内部运作?
  • 我认为这取决于种子。
  • 我认为您的意思是 .NET,而不仅仅是 C#
  • 我找不到 Random() 函数。我认为你的意思是 'var r = new Random(); while (true) { r.Next(); }'。对吗?
  • 我想您是在问“随机数流要多久才能重新开始?”。对吗?

标签: c# random cycle


【解决方案1】:

根据文档:

伪随机数以相等的概率从有限的 一组数字。选择的数字是 不是完全随机的,因为 明确的数学算法是 用于选择它们,但它们是 足够随机的实用 目的。目前的实施 随机类的基于唐纳德 E. Knuth 的减法随机数 生成器算法。更多 信息,请参见 D. E. Knuth。 “艺术 计算机编程,第 2 卷: 半数值算法”。 Addison-Wesley, 雷丁, MA, 第二 1981 年版。

减法生成器(Knuth,第 2 卷) Xf,n = (Xf,n-k - Xf,n-j) mod 1。 有关 k 和 j 的可能值的表格,请参阅 Knuth。我们选择 k = 63, j = 31。这个生成器很有趣,因为:

  • 它的周期很长。此序列中最低有效位的周期为 2k-1。实际周期比这长得多。
  • 有一些轻微的限制,所涉及的浮点运算是精确的!

当 X 是以下形式时,第二个属性成立 l 247 (0 × l

这允许由 Fortran 代码生成基本随机数序列

  x(n) = x(n-k) - x(n-j)
  if (x(n) < 0.0) x(n) = 1.0 + x(n)

在实践中,随机数是根据需要分批生成的,并存储在一个充当循环缓冲区的数组中。

提到的算法有一个取决于种子值的周期 - 你可以找到more details here

【讨论】:

猜你喜欢
  • 2021-08-08
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多