Моделирование случайного блуждания, основанное на подбрасывании смещенной монеты 100 раз - PullRequest
0 голосов
/ 30 апреля 2020

Я начинаю с Python. Я пытаюсь создать симуляцию случайного блуждания по прямой линии (север и юг), основанного на подбрасывании смещенной монеты 100 раз с 0,3 шансами на хвосты и 0,7 шансами на головы, предполагая, что значения от начальной точки до юг отрицательный, а с начальной точки на север положительный.

Я пробовал две разные вещи, но они не работают должным образом.

import random
def prob(p):
return random.random()<p
def random_walk(n):
heads=0
tails=0
t=0
for i in range(n):
    if prob(0.3):
        heads += 1
        t=t-1
    if prob (0.7):
        tails += 1
        t=t+1
print (heads, "heads")
print (tails, "tails")
print (t)
return t

heads=0
tails=0
t=0
for i in range(0,100):
    if prob(0.3):
        heads += 1
        t=t-1
    if prob(0.7):
        tails += 1
        t=t+1
print (heads, "heads")
print (tails, "tails")
print (t)

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Проблема здесь связана с вашими вызовами функции prob. Поскольку вы вызываете функцию дважды за каждую итерацию вашего for i in range(n) l oop, вы получаете два разных RN.

Кроме того, если random.random() возвращает, скажем, 0.1 и 0.2, то оба блока, связанных с if prob(0.3): и if prob(0.7):, будут выполняться в одном и том же моделировании l oop.

Вам нужно вызывать random.random() один раз за выполнение l oop и сделать оба оператора if взаимоисключающими - например, изменив его на блок if / else.

Вот способ чтобы исправить эти проблемы:

for i in range(n):
    coin_has_flipped_tails = prob(0.3)
    if coin_has_flipped_tails:
        tails += 1
        t += 1
    else:  # this implies that the coin has flipped head
        heads += 1
        t -= 1
1 голос
/ 30 апреля 2020

То, что вы делаете, это не подбрасывает монету 100 раз, а 200 раз!

Каждый вызов функции prob() - это подбрасывание монеты. Теперь каждая итерация цикла for содержит 2 вызова - сначала с 0,3, затем с 0,7.

то, что вы ищете, может быть примерно таким:

for _ in range(n):
  if prob(0.3):
    heads +=1
  else:
    tails +=1

Таким образом, вы делаете ровно 100 бросков (пробных вызовов), и каждый из них является либо головой, либо хвостом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...