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

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页)

  • @Dukeling常量仅使用一次,以缓和传入的种子.我非常强烈的怀疑是,它被选为一个[没有我的袖子号](http://en.wikipedia.org/wiki/Nothing_up_my_sleeve_number),它可以阻止种子设置很少(可能是一个共同的选择)搞砸了随机数发生器(而不是phi的一些神奇属性). (29认同)
  • 你知道为什么一个基于Phi的数字作为种子做出了不错的选择吗?可以在这里总结一下吗? (17认同)
  • 刚看了一下随机数字论文 - 这条线突出了一点 - "如果能找到SSL协议的实现(或设计)中的安全漏洞,那么人们甚至无法理解其中的反响."(页4) (14认同)
  • 引用上述书中的引用_根据Knuth的说法,任何大的MBIG和任何较小的(但仍然很大的)MSEED都可以代替上述值.所以这是数学上的乐趣,或多或少..所以正确的答案应该是: _没有.但它基于Phi._ (7认同)
  • 我认为使用黄金比例的更相关的方法是使用(模数/ phi)而不是使用与基数10无关的代码中的数字的基数10表示.一个有趣的phi特征我在该页面上没有看到的是从我所知道的,对于任何整数N,值N/phi-int(N/phi)> = 1/N/sqrt(5).这意味着即使生成一个数字序列N/phi-int(N/phi),最近的一对之间的距离也将在区间内最大可能的均匀间隔的sqrt(5)因子内( 0..1) (2认同)

Sal*_*ali 62

该数字取自黄金比率 1.61803398*10 ^ 8.Matt给出了一个很好的答案,这个数字是什么,因此我只想解释一下算法.

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

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

生成器基于以下递归: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上找到此相关问题,以了解有关此类数字的更多信息.这是一个引用:

"如果随机选择常数,那么很有可能,攻击者无法打破它." 但是当一个人说:"让我们使用这套常数时,密码学家是一个偏执狂的人,他们会持怀疑态度.我发誓随意挑选它们." 因此,作为妥协,他们将使用常数,例如π的二进制扩展.虽然我们不再具有从一些大数字中随机选择它们的数学好处,但我们至少可以更加自信没有破坏.

  • 对于答案者来说,这不仅仅是因为他们的熵,也是因为这些数字加倍[无论如何](http://en.wikipedia.org/wiki/Nothing_up_my_sleeve_number)数字. (5认同)