Эксперименты с монетой (Эл Свейгарт)

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

import random

numberOfStreaks = 0
arr = []
subArr = ["OOOOOO", "PPPPPP"]

def coinFlip(array) :
    for i in range(0, 100, 1):
        coin = random.randint(0, 1)
        if coin == 1 :
            array.append("O")
        else :
            array.append("P")
    return array

res = coinFlip(arr)

for i in subArr :
    for j in res :
        if i in j :
            numberOfStreaks = numberOfStreaks + 1

print(res)
print(numberOfStreaks)
input("\nEnter")

Проблема заключается в том, что у меня не получается найти количество вхождений заданного подсписка в основном списке. Собственно проблемное место :

for i in subArr :
        for j in res :
            if i in j :
                numberOfStreaks = numberOfStreaks + 1

Пожалуйста, помогите исправить


Ответы (4 шт):

Автор решения: ganz
import random

numberOfStreaks = 0
arr = []
subArr = ["OOOOOO", "PPPPPP"]

def coinFlip(array) :
    for i in range(0, 100, 1):
        coin = random.randint(0, 1)
        if coin == 1 :
            array.append("O")
        else :
            array.append("P")
    return array

res = coinFlip(arr)

sixO=0
sixR=0
nowO=0
nowR=0
for it in res:
    if it=='O':
        nowO+=1
        nowR=0
    else:
        nowR+=1
        nowO=0
    if nowO==6:
        sixO+=1
        nowO=0
    if nowR==6:
        sixR+=1
        nowR=0

print(sixR,sixO)

Суть решения создаём четыре счётсчика для два для текущего показателя, два для итоговых. Сравнивая каждый элемент плюсуем текущий показатиль либо орла либо решка, обнуляя показатель противоположный. При достижении нужного количества вхождений плюсуюм результат. Но есть загвоздка: o ooooo o должно защитаться за одно вхождение либо за два. & я бы игрался с модулем itertools и [].count('') для более быстрого кода

→ Ссылка
Автор решения: CrazyElf

Если суммарно и тех и тех, то работает, если поменять вашу проверку на такую:

for i in subArr :
    for j in range(len(res)):
        if list(i) == res[j:j+6]:
            numberOfStreaks = numberOfStreaks + 1

Т.е. вырезаем из полученного списка 6 элементов и сравниваем их с символами элемента списка искомых последовательностей.

→ Ссылка
Автор решения: SergFSM

задачу вы уже решили, поэтому предложу для разнообразия два чуть более "продвинутых" варианта решения:

в регулярным выражением:

from random import choices
from re import findall

res = choices(['O','P'], k=100)
number_of_streaks = sum(len(i)-5 for i in findall(r'O{6,}|P{6,}',''.join(res)))

с рекурсией:

from random import choices

res = ''.join(choices(['O','P'], k=100))
f = lambda x, y: 0 if (i:=x.find(y))==-1 else 1 + f(x[i+1:], y)
number_of_streaks = sum(f(res, i) for i in ['OOOOOO','PPPPPP'])
→ Ссылка
Автор решения: W0lf_Alex

Ответ на задание из книги Эл Свейгарт основы программирования это моё решение задачи Эксперименты с монетой При выполнении этого упражнения мы попробуем провести эксперимент. Если вы подбросите монету 100 раз и запишите ‘Р’ для решки и ‘О’ — для орла, то получите список вида “ООООРРРРОО...” Если попросить человека придумать результаты 100 случайных подбрасываний монеты, то, скорее всего, он предложит примерное чередование орла и решки, например “ОРОРООРОРР”. Такие результаты выглядят случайными с точки зрения человека, но они вовсе не являются случайными с математической точки зрения. Человек практически никогда не запишет ряд из шести решек Списки 161 или шести орлов, хотя при случайных подбрасываниях монеты такое вполне может произойти. Люди плохо имитируют случайные результаты. Напишите программу, которая позволит узнать, насколько часто серия из шести решек или шести орлов появляется в случайно сгенерированном списке. Программа должна состоять из двух частей: в первой части генерируется список случайно выбранных значений орлов и решек, а во второй части проверяется, есть ли в нем интересующая нас серия. Поместите весь этот код в цикл, который повторяет эксперимент 10 000 раз, чтобы мы могли выяснить частоту появления длинных серий. Подсказка: функция random, randint (0, 1) с равной вероятностью (50%) возвращает 0 или 1. Можно начать со следующего шаблона.

import random
numberOfStreaks = 0
for experimentNumber in range (10000) :
# Код, создающий список из 100 решек или орлов
# Код, проверяющий наличие серии
# из 6 орлов или решек подряд
print('Вероятность появления серии: %s%%' % (numberOfStreaks / 100))

Конечно, это лишь примерная оценка, но 10 000 — вполне приличный размер выборки. Знание основ статистики позволит получить точный ответ и избавит от необходимости писать программу, но современные программисты, увы, плохо разбираются в математике.

import random

number_of_streaks = 0

for experimentNumber in range(10000)

    arrays = []

    for heads_tails in range(100):
        arrays.append(random.randint(0,1))

    old = arrays[0]
    new = 0
    counter = 0
    arrays.pop(0)

    for index in arrays:
        new = index
        if old == new:
           counter += 1
           old = new
           if counter == 6:
               number_of_streaks += 1
               counter = 0
         else:
            old = new
            counter = 0
print('Odds streaks 6 heads or tails: %s%%' % (number_of_streaks / 100))

Внимание!!! Я новичок в этом деле лучше проверьте зарубежные сайты и не доверяйте слепо моему решению я знаю не больше вашего если не меньше!!!

→ Ссылка