最小标准随机生成器基础知识

时间:2014-10-10 06:33:28

标签: algorithm random

最小标准随机数生成器。

我正在阅读有关最低标准数字生成器的信息,如下所示

  

给定一个随机整数xn,随机的下一个随机整数   通过计算xn + 1 = a xn(mod m)给出序列,其中a = 7 ^ 5 =   16807和m = 2 ^ 31 - 1 = 2147483647;作为对你的检查   实现,如果x0 = 1,则x10000 = 1043618065。

     

帕克和米勒选择m作为最大的梅森素数小于2 ^ 32;   m的最小原始根是7,因为5也是素数,7 ^ 5   也是一个原始的根,因此他们选择了一个。因为a是a   m的原始根,1到m - 1范围内的所有值都将   在重复之前生成,因此随机数生成器已满   期。乘数a = 16807已被证明具有良好的效果   随机性。

     

在他们的原始论文之后,Park和Miller推荐了48271   作为改进,有些人使用69621,但我们会继续   使用16807.最简单的实现方法很明显:只是   将a乘以x的当前值并计算模数。

     

但这可能会导致中间乘法溢出,   渲染结果不正确。

     

Linus Schrage的一个技巧允许在没有的情况下完成乘法   溢出:计算q =⌊m/a⌋和r = m(mod a),使得m = a q + r。   然后

     

新的x可以通过hi =⌊x/q⌋,lo = x(mod q),x = a·lo来计算 -   r·hi,如果x≤0,则将m加到x。

我的问题是作者如何以hi = floor(x / q)和lo = x(modq)计算新x。我在这里寻找步骤。请好好的。

1 个答案:

答案 0 :(得分:3)

让我们简化表示法。设置H = hi,L = lo。我们有m = a * q + r。一个简单的计算表明q = 127773和r = 2836.我们观察到a <1。 Q值。

现在让x_ {n}给出并计算H = x_ {n} / q和L = x_ {n}%q。因此,x_ {n} = q * H + L,L

根据定义,x_ {n + 1} = a * x_ {n} mod m。计算右侧(在缩减模m之前)我们得到* x_ {n} = a *(q * H + L)= a * q * H + a * L =(m - r)* H + a * L = m * H - r * H + a * L.

现在让我们考虑r * H.显然0&lt; = r * H&lt; a *(x_ {n} / q)。如x_ {n}&lt; m和如上所述a&lt; q,a *(x_ {n} / q)&lt;米特别是,它不会溢出。

同样0&lt; a * L&lt; a * q&lt;米所以,再没有溢出。

我们得出结论x_ {n + 1} = m * H - r * H + a * L.减少后一个模m我们得到x_ {n + 1} = -r * H + a * L两个右手边的表情溢出了m。如果总和是负数,我们加m,我们就完成了。