是161803398 A 'Special'号码吗?Math.Random()内部
本文关键字:Random Math 内部 号码 161803398 Special | 更新日期: 2023-09-27 18:03:31
我怀疑答案是'因为数学',但我希望有人能在基本层面上给出更多的见解…
我今天在BCL源代码中闲逛,看看我以前使用的一些类是如何实际实现的。我以前从来没有想过如何生成(伪)随机数,所以我决定看看它是如何实现的。
完整的源代码在这里:http://referencesource.microsoft.com/#mscorlib/system/random.cs#29
private const int MSEED = 161803398;
这个MSEED值在每次Random()类被播种时使用。
无论如何,我看到了这个"神奇的数字"——161803398——我不知道为什么这个数字被选中了。它不是质数,也不是2的幂。这并不是一个看起来更重要的数字的"一半"。我用二进制和十六进制看了看,对我来说,它就像一个数字。
我试着在谷歌上搜索这个号码,但我什么也没找到。
不,但它是基于Phi("黄金分割率")。
161803398 = 1.61803398 * 10^8 ≈ φ * 10^8
更多关于黄金分割的信息请点击这里。
和真的很适合这里的业余数学家。
我找到了一篇关于随机数生成器的研究论文,该论文同意这一断言。(见第53页)
这个数字取自黄金比例1.61803398 * 10^8。Matt给出了一个很好的答案,这个数字是什么,所以我只解释一点关于一个算法。
这不是这个算法的特殊数字。算法为Knuth的减法随机数生成算法,其要点为:
- 存储56个随机数的循环列表
- 初始化是填充列表的过程,然后用特定的确定性算法随机化这些值
- 保留两个指数,间隔31
- 新随机数为两个指标下的两个值之差
- 在列表中存储新的随机数
生成器基于以下递归:Xn = (Xn-55 - Xn-24) mod m,其中n ≥0. 这是滞后斐波那契生成器的部分情况:Xn = (Xn-j @ Xn-k) mod m,其中0
这个生成器有几种实现。的实现在他的书中。我找到了下面的代码,加上下面的注释:
参数(MBIG=1000000000,MSEED=161803398,MZ=0,FAC=1.E-9)
显示对于Knuth来说,任何大型MBIG和任何较小(但仍然很大)的MSEED都可以
请注意,这实际上不是一篇研究论文(如Math所述),这只是一篇硕士学位论文。
密码学中人们喜欢使用无理数(pi
, e
, sqrt(5)
),因为人们猜想这些数字的数字出现的频率相等,因此具有高熵。您可以在security stackexchange上找到这个相关问题,以了解有关这些数字的更多信息。以下是引用:
"如果常数是随机选择的,那么很有可能不会攻击者将能够破坏它。"但是密码学家,作为一个偏执的人,当有人说,"让我们用这套。常量。我发誓,我是随便挑的。"作为妥协,他们会用常数,比如π的二进制展开。当我们不再有选择它们的数学上的好处从一些大的数字池中随机抽取,我们至少可以得到更多确信没有蓄意破坏。