伪数生成

时间:2011-12-15 12:31:31

标签: algorithm random

以下是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

我的问题

  1. 作者通过随机数来表示什么是通过规范化来计算的?

  2. 作者如何使用Eq 1中的Eq 2?

  3. 作者如何使用Eq 3?

2 个答案:

答案 0 :(得分:3)

  1. 归一化意味着如果你有X∈[0,1]而你需要得到Y∈[a,b]你可以计算

    Y = a + X *(b - a)

  2. 修改 我们假设

    a = 3, x = 5, m = 9 
    

    然后我们有 enter image description here

    其中[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)

  1. 如果您在[0,1]范围内有一个随机数,您可以通过乘以3并加2来获得[2,5]范围内的数字。