Подсчитайте броски кубиков, чтобы попасть в файл 5 100 раз(доска 0-5)

#python #dice

Вопрос:

Я пытаюсь выяснить, сколько раз вам нужно бросить кости, чтобы попасть в файл 5 100 раз(доска разыгрывается от 0 до 5). Вот как я пытался(я знаю, что ответ 690, но я не знаю, что я делаю неправильно).

 from random import *
seed(8)
five = 0
count = 0
add = 0
while five < 100:
    count = count   1
    print(randint(1,6))
    add = add   randint(1,6)
    if add % 5 == 0 :
        five = five   1
    else: add = add   randint(1,6)
    print(count)
 

Комментарии:

1. Отредактируйте вопрос, чтобы объяснить, что происходит?

2. Как вы думаете, почему ответ 690? Это случайный процесс. По статистике, для получения 100 пятерок требуется в среднем 600 бросков. Некоторые проблемы, о которых стоит подумать: вы генерируете числа от 1 до 6, а не от 0 до 5. Кроме того, помните, что КАЖДЫЙ звонок на randint новый номер. Предположительно, вы хотите сделать r = randint(0,5) это один раз, а затем использовать это значение в остальной части цикла.

Ответ №1:

Это код, который, я думаю, вы пытались написать. В среднем это составляет около 600. Возможно ли, что ваш «ответ» пришел из Python 2? Алгоритм случайного посева, скорее всего, отличается.

 from random import *
seed(8)
five = 0
count = 0
add = 0
while five < 100:
    count  = 1
    r = randint(0,5)
    if r == 5:
        five  = 1
    else: 
        add  = r
print(count, add)
 

Ответ №2:

Вы добавляете второй бросок кубика каждый раз, когда вы не попадаете на 5, это делает распределение вероятностей неравномерным (т. Е. Продвижение на 7 будет более вероятным (1/6), чем любое другое значение, например 1/9 для 5), поэтому ваш результат не будет таким же, как при подсчете одиночных бросков.

Кстати, для этого нет фиксированного результата, просто более высокая вероятность при заданном количестве бросков. Однако, учитывая, что вы ввели в генератор случайных чисел константу, каждый запуск должен давать один и тот же результат. И он должен быть правильным, если вы не бросите кости дважды.

Вот пример процесса, который достигает 690:

 import random
random.seed(8)
fiveCount  = 0
throwCount = 0
position   = 0
while fiveCount < 100:
    position = (position   random.randint(1,6)) % 6 
    throwCount  = 1
    fiveCount   = position == 5

print(throwCount) # 690
 

Другие замечания:

  • Обновление позиции выполняется по модулю 6 (имеется 6 позиций от 0 до 5 включительно).
  • Ваша проверка add%5 == 0 этого не отражает. Это должно было быть add%6 == 5 вместо этого, но всегда предпочтительнее моделировать вычисления как можно ближе к реальному процессу (поэтому держите позицию в диапазоне 0…5).