Марковский цепной генератор - PullRequest
0 голосов
/ 22 ноября 2018

Генератор должен взять начальную точку (целое число).При каждом прохождении результирующего объекта генератора к следующему должен быть выполнен случайный шаг от последней возвращенной точки (или начальной точки, если точка еще не была возвращена).Результат этого шага должен быть возвращен после выполнения шага.

import random

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

Что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы на правильном пути.Предполагая размер шага 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
0 голосов
/ 22 ноября 2018

Я ввел счетчик для простого тестирования, но вы можете просто пойти с бесконечным циклом.Это будет на 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]).

...