以下是Mark Allen Wessis的数据结构和算法分析文本。
以下x(i + 1)应该读作i + 1的x下标,而x(i)应该是 读为x下标i。
x(i + 1)=(a * x(i))mod m。
在开放区间中返回随机实数也很常见 (0,1)(0和1不是可能的值);这可以通过 除以m。由此,在任何封闭区间内的随机数[a, b]可以通过归一化来计算。
这个例程的问题在于乘法可以 溢出;虽然这不是错误,但它会影响结果和 因此伪随机性。施拉格给出了一个程序,其中所有的 计算可以在没有溢出的32位机器上完成。我们 计算m / a的商和余数,并将它们定义为q和 r,分别。
在我们的情况下,M = 2,147,483,647 A = 48,271,q = 127,773,r = 2,836,并且r <1。 Q值。
我们有
x(i + 1) = (a*x(i))mod m.---------------------------> Eq 1.
= ax(i) - m (floorof(ax(i)/m)).------------> Eq 2
另外作者提到:
x(i) = q(floor of(x(i)/q)) + (x(i) mod Q).--->Eq 3
我的问题
作者通过随机数来表示什么是通过规范化来计算的?
作者如何使用Eq 1中的Eq 2?
作者如何使用Eq 3?
答案 0 :(得分:3)
归一化意味着如果你有X∈[0,1]而你需要得到Y∈[a,b]你可以计算
Y = a + X *(b - a)
修改强> 我们假设
a = 3, x = 5, m = 9
然后我们有
其中[ax/m]
表示整数部分。
所以我们有15 = [ax/m]*m + 6
我们需要获得6. 15 - [ax/m]*m = 6
=&gt; ax - [ax/m]*m = 6
=&gt; x(i+1) = ax(i) - [ax(i)/m]*m
答案 1 :(得分:2)