马尔可夫链生成器

Markov chain generator

生成器应该有一个起点(一个整数)。随着生成的生成器对象的每次传递到下一个,应该执行从返回的最后一个点(或者如果尚未返回任何点,则为起点)开始的随机步骤。这一步的结果应该在执行完之后返回。

import random

def markov(start: int):
  for i in range (1):
     yield random.randint(i-1, i+1)

我的代码有什么问题?

为了便于测试,我引入了一个计数,但您可以使用无限循环。这将比最后一步后退 1 或更远,或者停留在最后一步。

import random

def markov(start: int):
  step = start
  count = 0
  while count<20:
     step = random.randint(step-1, step+1)
     yield step
     count += 1

您可以通过 list(markov(1)) 来测试这是否是您想要的。如果您总是希望它移动,我会将 step = random.randint(step-1, step+1) 替换为 step = random.choice([step-1, step+1])

你走在正确的轨道上。假设步长为 1(在任一方向),您应该能够完全摆脱 i 计数器:

>>> import random
>>>
>>>
>>> def markov(start: int):
...     location = start
...     while True:
...         yield location
...         location += random.randint(-1, 1)
...
>>>
>>> gen = markov(5)
>>> next(gen)
5
>>> next(gen)
6
>>> next(gen)
5
>>> next(gen)
6
>>> next(gen)
7
>>> next(gen)
6
>>> next(gen)
5
>>> next(gen)
4
>>> next(gen)
4
>>> next(gen)
3