使用随机函数在Racket中生成随机整数时,Racket要求参数为1和之间的数字4294967087.我只是想知道,4294967087号码来自哪里,为什么它是Racket可以生成的最大随机数?
它与无符号32位整数(4294967295)的最大值接近但不完全相等.我认为必须有一些理由选择这样一个特定的数字?
它是仍然小于 2 32 -1 的最大安全素数。它是 Pierre L'Ecuyer 最初实现的 MRG32k3a 算法的一部分。
他的论文“Good Parameter Sets for Combined Multiple Recursive Random Number Generators”解释了这个数字的重要性,该论文可以在L'Ecuyer 的论文网站上找到(作为 postscript 文件),也可以在http:// pubsonline.informs.org/doi/abs/10.1287/opre.47.1.159。MRG32k3a 算法的参考实现也可在此处找到:http://www.iro.umontreal.ca/~lecuyer/myftp/papers/combmrg2.c
在本文中,L'Ecuyer 分析了多个递归随机数生成器,并对参数集进行了详尽的搜索,使生成器具有理想的特性:长周期、良好的数字分布、高效的实现......
所讨论的值(在本文中称为 2 31 -209)是具有这些属性的 MRG32k3a 算法参数集的一部分。
(但不可否认,我没有做数学......)