Найти процент монетных полос - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь написать программу, чтобы выяснить, как часто полоса из шести голов или полоска из шести хвостов появляется в случайно сгенерированном списке голов и хвостов по 100 сальто, и повторяю это 10000 раз, чтобы найти процент бросок монеты содержит полосу из шести голов или хвостов подряд.

Мой код такой, и он работает. ** Интересно, дает ли он правильные результаты: **

import random
numberOfStreaks = 0
# Code that creates a list of 100 'heads' or 'tails' values.
for experimentNumber in range(10000):
    results = []
    for experiment in range(100):
        x = random.randint(1, 2)
        if x == 1:
            results.append('H')
        else:
            results.append('T')
    # Code that checks if there is a streak of 6 heads or tails in a row.
    currentStreak = 0
    previousResult = results[0]

    for result in results:
        if currentStreak == 6:
            numberOfStreaks += 1
            currentStreak = 0
        if result == previousResult:
            currentStreak += 1
            previousResult = result

print('Chance of streak: %s%%' % (numberOfStreaks / 100))

Ответы [ 3 ]

0 голосов
/ 13 февраля 2020

В вашем коде вы подсчитываете, сколько у вас полос в целом в каждом наборе результатов, а затем просто распечатываете это число, разделенное на 100. Это не совсем то, что вы хотели найти.

Вы хотите проверить, сколько экспериментов содержат полосу 6 или выше.

Вот мой джеб на этом.

Прежде всего, давайте настроим эксперимент .

import random

number_of_flips = 100
number_of_experiments = 10000
streak_length = 6
streaks = 0

Всегда хорошо установить их заранее, чтобы вы могли изменить их при настройке.

for experiment in range(number_of_experiments):
    # We want number_of_flips random values of 0 and 1 
    # (0 - head, 1 tails)
    flips = [random.randint(0, 1) for _ in range(number_of_flips)]

    # Now we want to see if we find any streaks of streak_length
    heads_streak = 0
    tails_streak = 0

    for i in flips:

      if i == 0:
        heads_streak += 1
        tails_streak = 0
        if heads_streak >= streak_length:
          streaks += 1
          break

      if i == 1:
        heads_streak = 0
        tails_streak += 1
        if tails_streak >= streak_length:
          streaks += 1
          break

    # At this point, if we found a streak, streaks grew by 1,
    # and if not, it remains unchanged

Теперь у нас есть количество экспериментов, в которых мы обнаружили полосы в streaks.

И мы можем найти это, разделив его на число экспериментов и умножив на 100.

print(streaks / number_of_experiments * 100, "%")

0 голосов
/ 13 февраля 2020

Когда вы получаете 7-е повторение голов или хвостов, это следует считать полосой, потому что последние 6 сальто образуют полосу. Сбрасывая счет после 6, вы недооцениваете количество полос.

С точки зрения вероятности, результат, который вы печатаете, не является мерой "случайности" (которая никогда не будет go выше 100%), но ближе к математическому ожиданию (т.е. сумма ожидаемых значений, умноженная на их соответствующую вероятность). Ваш код производит выборку из реальных попыток, но вычисления не имеют смысла, если их нельзя сравнить с правильными значениями вероятности.

вот как я бы реализовал эту выборку и express результаты:

import random
from itertools import accumulate
expCount   = 10000
expSize    = 100
streakSize = 6

numberOfStreaks = 0
for experimentNumber in range(expCount):
    results = [random.choice("HT") for _ in range(expSize)]
    consec  = [int(a==b) for a,b in zip(results,results[1:])]
    streaks = sum( s+1>=streakSize for s in accumulate(consec,lambda s,m:s*m+m))
    numberOfStreaks += streaks

ratio = numberOfStreaks / expCount
print(f'Obtained {numberOfStreaks} streaks of {streakSize} head/tail on {expCount} runs of {expSize} flips. On average {ratio:.2f} streaks per run')
0 голосов
/ 13 февраля 2020

Вам нужно поделить количество полос, которые вы получили, на количество возможных полос в 10000 экспериментах, это вероятность наличия полосы, которой я верю.

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