我正在尝试用Python编写一个程序,使用滞后斐波那契方法来计算伪随机数序列。我想生成 (0, 2**32) 范围内的 2000 个数字,然后绘制
x_i
与 x_i-1
的关系。我有:
def lag(s):
for i in range(k):
if i is 0:
out = (s[j-1] + s[k-1]) % m
elif 0 < i < k - 1:
s[i] = s[i+1]
else:
s[i] = out
print(s[i])
j, k, m = 7, 10, 2**32
X=[1]
for n in range(2000):
X.append(lag(X[-1]))
y = X[:]
y.append(y[0])
del y[0]
import matplotlib.pyplot as plt
plt.plot(X, y, '.')
当我运行程序时,出现错误
out = (s[j-1] + s[k-1]) % m TypeError: 'int' object is not subscriptable
我不确定这个错误意味着什么或如何修复它。有人可以帮忙吗?
这是我对滞后斐波那契生成器的实现:
from collections import deque
def lagged_fibonacci_sequence(j: int, k: int, m: int):
"""
A generator of a lagged Fibonacci Sequence defined by:
```text
F(n) = 1, for 0 <= n < k
F(n) = F(n - j) + F(n - k) (mod m), for n >= k.
```
"""
d = deque([1] * k)
while True:
yield d[-k]
d[-k] = (d[-j] + d[-k]) % m
d.rotate(-1)
我们可以使用以下命令生成前 2,000 个数字的 xn 与 xn-1 的关系图:
from itertools import islice
import matplotlib.pyplot as plt
data = list(islice(lagged_fibonacci_sequence(7, 10, 2**32), 2000 + 1))
plt.plot(data[:2000], data[1:], ".")
plt.show()