我正在尝试使用“组合线性同余生成器”生成10个伪随机数。 “组合线性同余生成器”的必要步骤如下:
因此对于我上述步骤的代码如下:
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新手。如果有人帮助我修复代码,那将是非常不错的。或者给我一些指导,以便我可以解决它。
答案 0 :(得分:1)
脚本有很多问题:
r = [0.0] * n
return tuple(r)
,否则可以不用括号,而只需return r
X = (Y1 - Y2) % (m1 - 1)
,这可能是一个错误,但是我对算法不够了解,无法判断哪种方法正确。解决了所有这些问题后,我认为这是一个正确的实现:
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
。