我怀疑答案是' 因为数学',但我希望有人能在基层提供更多的见解...
我今天在BCL源代码中探讨,看看我之前使用过的某些类是如何实际实现的。我以前从没想过如何生成(伪)随机数,所以我决定看看它是如何完成的。
完整来源:http://referencesource.microsoft.com/#mscorlib/system/random.cs#29
private const int MSEED = 161803398;
每次播种Random()类时都会使用此MSEED值。
无论如何,我看到了这个神奇的数字' - 161803398 - 我并不知道选择这个数字的原因最为模糊。它不是素数或2的幂。它不是半途而已。一个看起来更重要的数字。我用二进制和十六进制看了它,它看起来像是一个数字。
我尝试在Google上搜索这个号码,但我什么也没找到。
答案 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随机数生成器算法,其主要内容是:
生成器基于以下递归: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注意,这实际上不是一篇研究论文(如数学所述),这只是一个硕士学位论文。
密码学中的人喜欢使用无理数(pi
,e
,sqrt(5)
),因为有一种猜想such numbers的数字出现的频率相同,因此高entropy。您可以在security stackexchange上找到此相关问题,详细了解此类数字。这是一个引用:
“如果常数是随机选择的,那么概率很高,没有 攻击者将能够打破它。“但密码学家,是一个 偏执狂很多,当有人说,“让我们使用这套 常量。 I picked them at random, I swear。“作为妥协, 他们会使用常数,例如π的二进制展开。虽然我们 不再具有选择它们的数学好处 从一些大数字中随机抽取,我们至少可以更多 确信没有破坏。