python - 组合线性同余发生器

标签 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. 您正在为 r[i] 赋值,但此时列表为空;你应该初始化它以便能够像这样向它写入值; (例如)r = [0.0] * n
  2. 您在括号中返回 r,也许是因为您期望结果是一个元组?如果是这样,返回 tuple(r),否则您可以去掉括号,只返回 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 以外的任何内容。

关于python - 组合线性同余发生器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808559/

相关文章:

python - 当有人单击自定义按钮时,我可以触发什么输入事件?

python - Python 作为系统和应用程序编程语言流行的主要原因是什么?

python - 改变 Spyne 常量

python - Django修改pip安装的应用程序的模板

python - 楔形贴片位置未更新

python-3.x - 如何用一个滚动条滚动两个并行的文本小部件?

python如何删除关键字后的字符串

python - 显示 unicode 和频率时出错

python - 在 Python 中过滤列表

python - 有没有更好的方法在 python 中执行 "unravel"函数?