Статистика игрального кубика на 10000 раз Python

Рейтинг: 0Ответов: 1Опубликовано: 02.03.2023
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

Ответы

▲ 5Принят

Потому что с вероятностью (5/6)6 не один из шести счётчиков не увеличивается. Это вероятность примерно равна одной трети (совпадение). Треть попыток теряется.

Разберём по случаям:

  1. вероятность получить единицу равна 1/6. Тут всё честно.
  2. вероятность получить двойку равна 5/6 * 1/6. Первый множитель - P("не единица"), второй P("двойка"). Они перемножаются так как это два вызова diceroll(), которые предполагаются независимыми.
  3. вероятность получить тройку равна 5/6 * 5/6 * 1/6. Первый множитель - P("не единица"), второй - P("не двойка"), третий - P("тройка"). Они перемножаются так как это три вызова diceroll(), которые предполагаются независимыми.
  4. вероятность получить четвёрку равна (5/6)3 * 1/6.
  5. вероятность получить пятёрку равна (5/6)4 * 1/6.
  6. вероятность получить шестёрку равна (5/6)5 * 1/6.
  7. Вероятность ничего не получить равна (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))