【问题标题】:Recreating an RNG in Python在 Python 中重新创建一个 RNG
【发布时间】:2017-10-08 02:36:02
【问题描述】:

我正在尝试重新创建一个在 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 中是不可能的,或者我只是发疯了,但我非常需要一些建议。非常感谢任何见解。

【问题讨论】:

  • 1 将是 1,不管是什么基数。

标签: python matlab random


【解决方案1】:

看起来问题是公式应该是

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

【讨论】:

  • 非常感谢!我似乎真的误解了算法。一个问题:我不明白你对x 列表的使用:它与在x 的基数上加1 相同吗(正如pdf 似乎暗示的那样)?
  • 对,所以在这种情况下,基数位于 x[0],当我将列表初始化为 x = [1] 时,它设置为 1。这样您就可以更轻松地将 xk 称为 x[k]
  • 啊,是的,好的。现在更清楚了。谢谢你的时间! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2014-05-03
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多