Rob*_* P. 163 .net c# random algorithm
我怀疑答案是' 因为数学 ',但我希望有人能在基层提供更多的见解......
我今天在BCL源代码中探讨,看看我之前使用过的某些类是如何实际实现的.我以前从未想过如何生成(伪)随机数,所以我决定看看它是如何完成的.
完整来源:http://referencesource.microsoft.com/#mscorlib/system/random.cs#29
private const int MSEED = 161803398;
Run Code Online (Sandbox Code Playgroud)
每次播种Random()类时都会使用此MSEED值.
无论如何,我看到了这个"神奇的数字" - 161803398 - 而且我没有最简单的想法为什么选择这个数字.它不是一个素数或2的幂.对于一个似乎更重要的数字而言,它不是"中途".我用二进制和十六进制看了它,它看起来像是一个数字给我.
我试着在谷歌搜索这个号码,但我一无所获.
Mat*_*int 141
不,但它基于Phi("黄金比例").
161803398 = 1.61803398 * 10^8 ? ? * 10^8
Run Code Online (Sandbox Code Playgroud)
我发现了一篇关于随机数发生器的研究论文,它同意这个断言.(见第53页)
Sal*_*ali 62
该数字取自黄金比率 1.61803398*10 ^ 8.Matt给出了一个很好的答案,这个数字是什么,因此我只想解释一下算法.
这不是此算法的特殊编号.该算法是Knuth的减法随机数生成器算法,其主要内容如下:
生成器基于以下递归:X n =(X n -55 - X n-24)mod m,其中n≥0.这是滞后Fibonacci生成器的部分情况:X n =(X n-j @ X n-k)mod m,其中0 <k <j且@是任何二元运算(减法,加法,xor).
这个发生器有几种实现方式.Knuth在他的书中提供了FORTRAN的实现.我找到了以下代码,其中包含以下注释:
参数(MBIG = 1000000000,MSEED = 161803398,MZ = 0,FAC = 1.E-9)
根据Knuth的说法,任何大型MBIG和任何较小(但仍然很大)的MSEED都可以代替上述值.
在这里可以找到一点点注意,这实际上不是一篇研究论文(如数学所述),这只是一个硕士学位论文.
在密码学人喜欢使用无理数(pi
,e
,sqrt(5)
),因为存在这样的位的推测这样的数字显示具有相等的频率,并因此具有高的熵.您可以在security stackexchange上找到此相关问题,以了解有关此类数字的更多信息.这是一个引用:
"如果随机选择常数,那么很有可能,攻击者无法打破它." 但是当一个人说:"让我们使用这套常数时,密码学家是一个偏执狂的人,他们会持怀疑态度.我发誓随意挑选它们." 因此,作为妥协,他们将使用常数,例如π的二进制扩展.虽然我们不再具有从一些大数字中随机选择它们的数学好处,但我们至少可以更加自信没有破坏.