Симулируйте 2 человека, бросающего монету, пока не получите первую голову Python - PullRequest
2 голосов
/ 07 марта 2019

Итак, я A и B играю в игру, которая начинается с A подбрасывания монеты. Если он показывает голову, A выигрывает и игра окончена. В противном случае, B бросает, и если B получает голову, B выигрывает и игра заканчивается. По сути, игра продолжается до тех пор, пока чья-то монета не покажет голову первой.

Теоретически, вероятность A выигрыша равна 2/3, а вероятность B выигрыша равна 1/3. Ссылка здесь

Я пытаюсь смоделировать это в Python, запустив 4000 симуляции. Тем не менее, я не совсем близко к 2/3 для A и 1/3 для B. Ниже мой код:

import random

Atoss = 0
Btoss = 0

Awins = []
Bwins = []

for i in range(4001):
   head = False
   while (not head):
      A = random.randint(0, 2)  # random 0 and 1
      Atoss += 1

      if A == 1:
         head = True
      else:
         B = random.randint(0, 2)  # random 0 and 1
         Btoss += 1
         if B == 1:
            head = True

   totalToss = Atoss + Btoss
   Awin = Atoss / totalToss
   Awins.append(Awin)
   Bwin = Btoss / totalToss
   Bwins.append(Bwin)

probA = sum(Awins) / len(Awins)
probB = sum(Bwins) / len(Bwins)

print("Probability A: ", probA)
print("Probability B: ", probB)

Я где-то напутал?

EDIT:

Изменение randint(0, 2) на randint(0, 1) решает проблему, на что отвечает @bart cubrich

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Одна из ваших проблем заключается в том, что random.randomint должен быть

A = random.randint(0, 1)  # random 0 and 1
B = random.randint(0, 1)  # random 0 and 1

Ваша версия производила нули, единицы и двойки.Это полностью испортило шансы на получение голов, так как вы действительно бросали 3-х сторонний кубик со сторонами = [0,1,2], где выигрывает только «1».Пытаясь сделать следующее:

import random
random.seed(123)
Atoss = 0
Btoss = 0

Awins = 0
Bwins = 0

for i in range(4000):
   head = False
   while (not head):
      A = random.randint(0, 1)  # random 0 and 1

      if A == 1:
         Awins+=1
         head = True

      else:
         B = random.randint(0, 1)  # random 0 and 1
         if B == 1:
            Bwins+=1
            head = True



probA = Awins / (Awins+Bwins)
probB = Bwins / (Awins+Bwins)

print("Probability A: ", probA)
print("Probability B: ", probB)

Out:
'Probability A:  0.6653336665833541'
'Probability B:  0.3346663334166458'

Я получаю, что вероятность составляет ~ A: 66% B: 33%.

Обратите внимание, в документации от random.py

random.randint (a, b) -Возвратите случайное целое число N так, чтобы a <= N <= b. </p>

, который отличается от numpy.random.randomint, который дает

- случайное целое число N такое, что <= N <b </p>

Документация находится здесь

1 голос
/ 07 марта 2019

Ваши вычисления Awin и Bwin говорят, что если A выигрывает на 5-м броске, то, поскольку A бросил 3 раза, а B бросил 2 раза, A получает 3/5 выигрыша, а B получает 2/5.Это не то, как должна работать победа.

Кроме того, вы хотите random.randrange, а не random.randint, и ваше размещение инициализации Atoss и Btoss перед циклом, а не внутри циклаозначает, что они не сбрасываются на новой итерации.(Однако в правильной реализации подсчет количества лишних не требуется.)

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