161803398是“特殊”号码吗?在Math.Random()内部


162

我怀疑答案是“ 因为数学 ”,但是我希望有人可以在基本层面上提供更多的见解...

今天,我在研究BCL源代码,看看我以前使用的某些类是如何实现的。之前我从未考虑过如何生成(伪)随机数,所以我决定看看它是如何完成的。

此处的完整源代码:http : //referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

每次植入Random()类时都使用此MSEED值。

无论如何,我看到了这个“魔术数字”-161803398-我对为什么选择该数字没有最模糊的主意。它不是素数或2的幂,不是看似重要的数字的“一半”。我用二进制和十六进制格式查看了它,对我来说,它就像是一个数字。

我尝试在Google中搜索该号码,但未找到任何内容。



6
@ 48klocs:它在文档中是这样说的:The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Good

4
@ 48klocs是的,请参阅第283页:apps.nrbook.com/c/index.html他的原因似乎是“因为数学”。
eshs 2014年

22
@eshs:有趣的事实:您的链接的第283页显示了inextp = 31;,但是Random该类的源代码具有此名称,inextp = 21;因为有人错误键入了该错误导致此bug
杰西·古德

7
@Izkata我们需要就网站质量的长期目标(不只是针对短期目标(没有解决特定问题))针对正确的行为(避免错误投票关闭用户)教育用户。而且,如果我没有指出上述评论,那么它可能已经被关闭了,因为人们有时会这样做。
2014年

Answers:


141

不,但是它基于Phi(“黄金比例”)。

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

更多关于黄金分割率的信息

而一个真正的好读的休闲数学家在这里

我找到了一份关于随机数生成器的研究论文,该论文与这一主张相吻合。(请参阅第53页。)


17
您知道为什么基于Phi的数字是很好的选择吗?这里可以总结一下吗?
Bernhard Barker

29
@Dukeling常数仅使用一次,以调节传入的种子。我非常强烈的怀疑是,它被选为无用武之地,可以防止设置了几位的种子(也许是一个常见选择)搞乱随机数生成器(而不是phi的某些神奇特性)。
David Eisenstat 2014年

7
引用上述书中的报价。根据Knuth的说法,任何大MBIG和任何较小(但仍然很大)的MSEED都可以代替上述值。因此,或多或少地,它是数学上的乐趣。因此,正确的答案应该是:不。但这是基于Phi的。
TaW 2014年

14
只是看了一下那个随机数文件-这条线有点"One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."
引人注目

2
我认为使用黄金比率的一种更相关的方法是使用(模数/ phi)而不是使用与10无关的代码中以10为基的数字表示。我没有在该页面上看到的是,据我所知,对于任何整数N,值N / phi-int(N / phi)> = 1 / N / sqrt(5)。这意味着即使生成一个数字序列N / phi-int(N / phi),最接近的一对之间的距离也将在间隔( 0..1)
超级猫

62

此数字取自黄金比例 1.61803398 * 10 ^ 8。马特给出了一个很好的答案,这个数字是多少,因此,我将只介绍一下算法。

这不是该算法的特殊数字。该算法是Knuth的减法随机数生成器算法,其要点是:

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

生成器基于以下递归:X n =(X n-55 -X n-24)mod m,其中n≥0。这是滞后斐波那契生成器的部分情况:X n =(X n-j @ X n-k)mod m,其中0 <k <j并且@是任何二进制运算(减法,加法,异或)。

此生成器有几种实现。Knuth在他的书中提供了FORTRAN的实现。我发现以下代码,并带有以下注释:

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

根据Knuth的说法,任何较大的MBIG和任何较小(但仍很大)的MSEED都可以代替上述值。

多一点点,可以发现这里请注意,这不是真正的研究论文(如数学陈述),这仅仅是一个硕士学位论文。

人在密码学像使用无理数(piesqrt(5)),因为有一个猜想的位数这样的数字出现频率相同,并因此具有高的。您可以在安全堆栈交换上找到此相关问题,以了解有关此类数字的更多信息。这是一个报价:

“如果常量是随机选择的,那么攻击者就不可能破解它。” 但是密码学家是一个偏执狂,当有人说:“让我们使用这组常数时,我会怀疑。我随机选择它们,我发誓。” 因此,作为一种折衷,他们将使用常量,例如π的二进制扩展。虽然我们不再具有从大量数字中随机选择它们的数学好处,但我们至少可以更确信没有人为破坏。


5
至于答案,这不仅是因为它们的熵,还因为这些数字是我袖口数字的两倍。
科尔·约翰逊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.