Подброс монетки
Помогите, никак не могу решить задачу
Какое минимальное количество раз вы должны подбросить монетку, чтобы три раза подряд выпал либо орел, либо решка? А какое максимальное количество попыток может для этого понадобиться? А в среднем? В данном задании вам требуется создать симулятор подбрасывания виртуальной монетки.
Напишите программу, использующую для подброса монетки генератор случайных чисел Python. Монетка при этом должна быть правильной формы, что означает равную вероятность выпадения орла и решки. Подбрасывать монетку необходимо до тех пор, пока три раза подряд не выпадет одно значение, вне зависимости от того, орел это будет или решка.
Выводите на экран букву О всякий раз, когда выпадает орел, и Р – когда выпадает решка. При этом для одной симуляции бросков все выпавшие значения необходимо размещать на одной строке. Также необходимо известить пользователя о том, сколько попыток потребовалось, чтобы получить нужный результат.
Программа должна выполнить десять симуляций и в конце представить минимальное, среднее и максимальное количество подбрасываний монетки, требуемое для достижения нужного нам результата.
Пример вывода программы показан ниже: О Р Р Р (попыток: 4) О О Р Р О Р О Р Р О О Р О Р Р О Р Р Р (попыток: 19) Р Р Р (попыток: 3) Р О О О (попыток: 4) О О О (попыток: 3) Р О Р Р О Р О О Р Р О О Р О Р О О О (попыток: 18) О Р Р О О О (попыток: 6) Р О Р Р Р (попыток: 5) Р Р О Р Р О Р О Р О О О (попыток: 12) Р О Р Р Р (попыток: 5)
Минимальное количество попыток: 3 Среднее количество попыток: 7,9 Максимальное количество попыток: 19
Ответы (1 шт):
Вместо random.randint(0,1) лучше использовать random.getrandbits(k), работает он в 13 раз быстрее да и под задачу подходит.
%%timeit 1000
random.randint(0,1)
# 893 ns ± 18.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%%timeit 1000
random.getrandbits(1)
# 67.4 ns ± 1.01 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
Запускаем цикл 10 раз, в каждом запускаем вложенный цикл, который выполняется до тех пор пока не будет больше 2 подбрасываний и пока последние 3 элемента не будут равны друг другу. Количество подбрасываний записываем в tries и в конце выводим подсчёты.
Решение
from random import getrandbits as b
d = {1:'Р', 0:'О'}
tries = []
for _ in range(10):
l = []
while len(l)<3 or len(set(l[-3:])) != 1: l.append(b(1))
tries.append(len(l))
print('{} (попыток: {})'.format(' '.join(map(d.get, l)), tries[-1]))
print('\nМинимальное количество попыток: {}'.format(min(tries)))
print('Среднее количество попыток: {}'.format(sum(tries) / len(tries)))
print('Максимальное количество попыток: {}'.format(max(tries)))
Вывод:
О Р Р О О О (попыток: 6)
Р О Р Р Р (попыток: 5)
Р Р О О Р Р Р (попыток: 7)
О Р Р Р (попыток: 4)
О Р О О О (попыток: 5)
О О Р Р Р (попыток: 5)
Р О О О (попыток: 4)
Р О О О (попыток: 4)
Р О Р О О Р О О Р Р Р (попыток: 11)
О Р Р О Р О Р О О Р О Р Р Р (попыток: 14)
Минимальное количество попыток: 4
Среднее количество попыток: 6.5
Максимальное количество попыток: 14