Python 落后的斐波那契生成器

问题描述 投票:0回答:1

我正在尝试用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

我不确定这个错误意味着什么或如何修复它。有人可以帮忙吗?

python random fibonacci
1个回答
0
投票

这是我对滞后斐波那契生成器的实现:

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()

© www.soinside.com 2019 - 2024. All rights reserved.