Статистика игрального кубика на 10000 раз Python
print((f"\ndice roll\n").upper())
import random
def diceroll():
roll = random.randint(1,6)
return roll
sum_roll_1 = 0
sum_roll_2 = 0
sum_roll_3 = 0
sum_roll_4 = 0
sum_roll_5 = 0
sum_roll_6 = 0
diceroll()
for i in range(10000):
if diceroll() == 1:
sum_roll_1 += 1
elif diceroll() == 2:
sum_roll_2 += 1
elif diceroll() == 3:
sum_roll_3 += 1
elif diceroll() == 4:
sum_roll_4 += 1
elif diceroll()==5:
sum_roll_5 += 1
elif diceroll()==6:
sum_roll_6 += 1
print((f'статистика на 10000:\n').upper())
print(f"1 выпала {sum_roll_1} раз\n2 выпала {sum_roll_2} раз\n3 выпала {sum_roll_3} раз\n4 выпала {sum_roll_4} раз\n5 выпала {sum_roll_5} раз\n6 выпала {sum_roll_6} раз\n")
print(sum_roll_1 + sum_roll_2 + sum_roll_3 + sum_roll_4 + sum_roll_5 + sum_roll_6)
Помогите разобраться почему при проверке суммы не выходит 10_000
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Потому что с вероятностью (5/6)6 не один из шести счётчиков не увеличивается. Это вероятность примерно равна одной трети (совпадение). Треть попыток теряется.
Разберём по случаям:
- вероятность получить единицу равна 1/6. Тут всё честно.
- вероятность получить двойку равна 5/6 * 1/6. Первый множитель - P("не единица"), второй P("двойка"). Они перемножаются так как это два вызова
diceroll(), которые предполагаются независимыми. - вероятность получить тройку равна 5/6 * 5/6 * 1/6. Первый множитель - P("не единица"), второй - P("не двойка"), третий - P("тройка"). Они перемножаются так как это три вызова
diceroll(), которые предполагаются независимыми. - вероятность получить четвёрку равна (5/6)3 * 1/6.
- вероятность получить пятёрку равна (5/6)4 * 1/6.
- вероятность получить шестёрку равна (5/6)5 * 1/6.
- Вероятность ничего не получить равна (5/6)6.
Таблица:
исход формула значение 1 1/6 0.167 2 5/6 * 1/6 0.139 3 (5/6)^2 * 1/6 0.116 4 (5/6)^3 * 1/6 0.096 5 (5/6)^4 * 1/6 0.080 6 (5/6)^5 * 1/6 0.067 - (5/6)^6 0.335 сумма 1 1.000
Проверка на практике:
DICE ROLL СТАТИСТИКА НА 10000: 1 выпала 1694 раз 2 выпала 1374 раз 3 выпала 1145 раз 4 выпала 962 раз 5 выпала 804 раз 6 выпала 638 раз 6617
Предсказанные вероятности довольно хорошо совпали с реальными результатами.
Проблема в том что нельзя при сборе статистики вызывать diceroll несколько раз. Один вызов, одно увеличение счётчика:
...
for i in range(10000):
roll = diceroll()
if roll == 1:
sum_roll_1 += 1
elif roll == 2:
sum_roll_2 += 1
elif roll == 3:
sum_roll_3 += 1
elif roll == 4:
sum_roll_4 += 1
elif roll == 5:
sum_roll_5 += 1
elif roll == 6:
sum_roll_6 += 1
...
Статистика сразу выправляется:
DICE ROLL СТАТИСТИКА НА 10000: 1 выпала 1675 раз 2 выпала 1669 раз 3 выпала 1696 раз 4 выпала 1669 раз 5 выпала 1652 раз 6 выпала 1639 раз 10000
Если немного причесать вашу программу получится:
import random
def diceroll():
return random.randint(1,6)
print(('\ndice roll\n').upper())
sums = [0] * 7
for i in range(10000):
sums[diceroll()] += 1
print(('статистика на 10000:\n').upper())
for i in range(1, len(sums)):
print(f'{i} выпала {sums[i]} раз')
print()
print(sum(sums))