组合线性同余发生器

时间:2018-12-17 03:17:57

标签: python python-3.x

我正在尝试使用“组合线性同余生成器”生成10个伪随机数。 “组合线性同余生成器”的必要步骤如下:

enter image description here

因此对于我上述步骤的代码如下:

import random as rnd

def combined_linear_cong(n = 10):

    R = []

    m1 = 2147483563
    a1 = 40014
    m2 = 2147483399
    a2 = 40692

    Y1 = rnd.randint(1, m1 - 1)
    Y2 = rnd.randint(1, m2 - 1)

    for i in range (1, n):

        Y1 = a1 * Y1 % m1
        Y2 = a2 * Y2 % m2

        X = (Y1 - Y2) % (m1 - 1)

        if (X > 0):
           R[i] = (X / m1)
        elif (X < 0):
           R[i] = (X / m1) + 1
        elif (X == 0):
           R[i] = (m1 - 1) / m1

    return (R)

但是我的代码无法正常工作。我是Python新手。如果有人帮助我修复代码,那将是非常不错的。或者给我一些指导,以便我可以解决它。

1 个答案:

答案 0 :(得分:1)

脚本有很多问题:

  1. 您正在为r [i]分配值,但此时列表为空;您应该对其进行初始化,以便能够像这样向其写入值; (例如)r = [0.0] * n
  2. 您正在括号中返回r,也许是因为您期望得到一个元组?如果是这样,请return tuple(r),否则可以不用括号,而只需return r
  3. 该描述建议x [i + 1]应该为(y [i + 1,1]-y [i + 1,2])mod m1,但是您正在做X = (Y1 - Y2) % (m1 - 1),这可能是一个错误,但是我对算法不够了解,无法判断哪种方法正确。
  4. 这不是错误,但是在警告之间很难发现错误:您没有遵循Python命名约定;您应该对变量名使用小写字母,并且可以稍微清理一下空格。

解决了所有这些问题后,我认为这是一个正确的实现:

import random as rnd


def combined_linear_cong(n = 10):
    r = [0.0] * n

    m1 = 2147483563
    a1 = 40014
    m2 = 2147483399
    a2 = 40692

    y1 = rnd.randint(1, m1 - 1)
    y2 = rnd.randint(1, m2 - 1)

    for i in range(1, n):

        y1 = a1 * y1 % m1
        y2 = a2 * y2 % m2

        x = (y1 - y2) % m1

        if x > 0:
            r[i] = (x / m1)
        elif x < 0:
            r[i] = (x / m1) + 1
        elif x == 0:
            r[i] = (m1 - 1) / m1

    return r


print(combined_linear_cong())

注意:elif x == 0:是多余的,您也可以写else:,因为此时x只能是0