使用random函数在Racket中生成随机整数时,Racket要求参数为1
和4294967087
之间的数字。我只是想知道, 4294967087 号码来自哪里,为什么它是Racket可以生成的最大随机数?
它与无符号32位整数(4294967295)的最大值接近但不完全相等。我认为必须有一些理由选择这样一个特定的数字?
答案 0 :(得分:4)
最大safe prime仍然小于2 32 -1。它是Pierre L' Ecuyer最初实施MRG32k3a算法的一部分。
这个数字的重要性在他的论文"组合多个递归随机数发生器的良好参数集" 中有解释,可在papers website of L'Ecuyer上找到(如一个postscript文件),以及http://pubsonline.informs.org/doi/abs/10.1287/opre.47.1.159的PDF格式。 MRG32k3a算法的参考实现也可在那里找到:http://www.iro.umontreal.ca/~lecuyer/myftp/papers/combmrg2.c
在本文中,L' Ecuyer分析了多个递归随机数生成器,并对参数集进行了详尽的搜索,使得生成器具有理想的属性:长周期,良好的数字分布,高效实现......
有问题的值(本文中称为2 31 -209)是具有这些属性的MRG32k3a算法的参数集的一部分。
(但不可否认,我没有做数学......)
答案 1 :(得分:2)
最大的安全素数小于2 ^ 32。他们使用这个数字是因为这给了他们的伪随机数生成器最大可能的周期。
安全素数 p 是一个素数( p - 1)/ 2也是素数。此其他素数称为 Sophie Germain prime 。