Потому что с вероятностью (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))