我正在尝试重新创建一个在 Matlab 中使用的乘法同余算法(找到它 here,第 9.2 节,阅读它以了解一些上下文)
基本上,我有 4 个变量
a = 13
c = 0
m = 31
最后一个,我无法将其格式化为代码,因为它破坏了下标:
x0= 1
有了这四个,我想重现这样的东西:
xk+1 = a *
xk + c mod m
到目前为止,我已经:
a = 13
c = 0
m = 31
base = 2 # Does not work with 0 for some reason
x = int(x='1', base=base)
for i in range(8):
rand = a * x + c % m
base += 1
x = int(x='1', base=base)
print(rand)
我的输出是:
13, 13, 13, 13, 13, 13, 13, 13...
尽管如此,根据文档,应该是:
1, 13, 14, 27, 10, 6, 16, 22...
所以我不确定我是否完全误解了这个问题,或者我想要完成的事情在Python中根本不可能实现,或者我是否只是发疯了,但我迫切需要一些建议。非常感谢任何见解。
最佳答案
看起来问题是公式应该是
xk+1 = (a * xk + c) mod m
文档中并不清楚,但如果您使用 c mod m,则每次都会执行相同的操作 (0mod31)。这一段 python 代码按其应有的方式运行:
a = 13
c = 0
m = 31
x = [1]
for i in range(1, 9):
x.append( (a * x[i-1] + c)%m )
print x[i],
13 14 27 10 6 16 22 7
关于python - 用 Python 重新创建 RNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43875638/