是161803398一个'特殊'号码?在Math.Random()里面

时间:2014-05-15 20:37:59

标签: c# .net algorithm random

我怀疑答案是' 因为数学',但我希望有人能在基层提供更多的见解...

我今天在BCL源代码中探讨,看看我之前使用过的某些类是如何实际实现的。我以前从没想过如何生成(伪)随机数,所以我决定看看它是如何完成的。

完整来源:http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

每次播种Random()类时都会使用此MSEED值。

无论如何,我看到了这个神奇的数字' - 161803398 - 我并不知道选择这个数字的原因最为模糊。它不是素数或2的幂。它不是半途而已。一个看起来更重要的数字。我用二进制和十六进制看了它,它看起来像是一个数字。

我尝试在Google上搜索这个号码,但我什么也没找到。

2 个答案:

答案 0 :(得分:141)

不,但它基于Phi("黄金比例")。

161803398 = 1.61803398 * 10^8 ≈ φ * 10^8

More about the golden ratio here

And a really good read for the casual mathematician here

我发现a research paper on random number generators同意这个断言。 (见第53页。)

答案 1 :(得分:62)

此号码取自golden ratio 1.61803398 * 10 ^ 8 。 Matt给出了一个很好的答案,这个数字是什么,所以我只想解释一下算法。

这不是此算法的特殊编号。该算法是 Knuth的subtractive随机数生成器算法,其主要内容是:

  • 存储56个随机数的循环列表
  • 初始化是填充列表的过程,然后使用特定的确定性算法随机化这些值
  • 保留两个指数
  • 的指数
  • 新随机数是两个指数
  • 的两个值之差
  • 在列表中存储新的随机数

生成器基于以下递归:X n =(X n-55 - X n-24 )mod m,其中n≥0。这是lagged Fibonacci generator的部分情况:X n =(X nj @ X nk )mod m ,其中0 < k&lt; j和@是任何二元运算(减法,加法,xor)。

此生成器有多种实现方式。 Knuth提供了一个实现 FORTRAN在他的书中。我发现了以下code,其中包含以下注释:

  

PARAMETER(MBIG = 1000000000,MSEED = 161803398,MZ = 0,FAC = 1.E-9)

     

根据   对于Knuth,任何大型MBIG,以及任何更小(但仍然很大)的MSEED都可以   取代上述值。

可以找到更多here注意,这实际上不是一篇研究论文(如数学所述),这只是一个硕士学位论文。

密码学中的人喜欢使用无理数(piesqrt(5)),因为有一种猜想such numbers的数字出现的频率相同,因此高entropy。您可以在security stackexchange上找到此相关问题,详细了解此类数字。这是一个引用:

  

“如果常数是随机选择的,那么概率很高,没有   攻击者将能够打破它。“但密码学家,是一个   偏执狂很多,当有人说,“让我们使用这套   常量。 I picked them at random, I swear。“作为妥协,   他们会使用常数,例如π的二进制展开。虽然我们   不再具有选择它们的数学好处   从一些大数字中随机抽取,我们至少可以更多   确信没有破坏。