(495)240-8280ПН-СБ с 12:00 до 20:00
We speak English

4.4. Практикум: Бросание игральных костей

В рамках данного урока вы будете моделировать ситуацию бросания игральных костей, используя случайные числа.

Вы научитесь:

  • Использовать функцию randint() для моделирования ситуации бросания игральных костей
  • Использовать список для подсчета общих результатов
  • Анализировать результаты

При бросании двух 6-гранных игральных костей сумма двух выпавших цифр в любом случае будет равна от 2 до 12. Какая сумма выпадет с большей вероятностью? С меньшей вероятностью? Напишите программу для моделирования ситуации бросания игральных костей и проанализируйте частоту выпадения каждой из 11 сумм.

Примечание для учителя: Моделирование в языке Python - это легкий и быстрый процесс. Вы можете моделировать тысячи бросков игральных костей в мгновение ока.
Ниже вы видите пример создания списка:

1. Создайте новый файл Python, используя шаблон "Случайное моделирование" (Random Simulations), как вы делали в предыдущем уроке.

Вам нужен список из 11 элементов, все из которых равны 0, чтобы работать с 11 суммами чисел, выпавшими на игральных костях (от 2 до 12). Простой способ создания списка в программировании на языке Python выглядит так:

totals = [0] * 11

Это выражение означает "создание списка из 11 элементов, все из которых равны 0". Помните знак * для "дублирования" из предыдущего урока?

(Попробуйте ввести это выражение в приложении Shell, чтобы убедиться, что оно работает).

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

trials = int(input("# of trials?"))

Знаки # и ? можно найти в кнопках пунктуации.

Далее создайте цикл с оператором for, чтобы имитировать бросание игральных костей:

for i in range(trials):

3. Теперь поработайте в блоке (block) цикла ("бросание игральных костей"). Используйте две переменные die1 и die2. Присвойте каждой из них случайное целое число от 1 до 6. Сначала попытайтесь сделать это самостоятельно, прежде чем переходить к следующему шагу...

Примечание для учителя: Это выглядит следующим образом: die1 = randint(1,6)

4. Вы догадались написать = randint(1,6) для каждой из них?

Теперь сложите две переменные die:

sum = die1 + die2

Сумма чисел будет в диапазоне от 2 до 12, но индекс бросков из списка будет в диапазоне от 0 до 10. Необходимо вычесть 2 из суммы, чтобы получить фактический индекс. Чтобы прибавить 1 к соответствующему элементу в списке бросков, выражение будет выглядеть следующим образом:

totals[sum - 2] = totals[sum - 2] + 1

Вы можете заметить, что это выражение похоже на выражение с=c+1. Каждый элемент списка - это отдельный счетчик.

5. С блоком (block) цикла разобрались. После того, как вы завершите все броски, нужно посмотреть результаты (totals).

Переместите курсор к началу следующей строки и введите выражение для отображения результатов:

print(totals)

6. Теперь протестируйте программу: при ее запуске попробуйте ввести небольшое число бросков, например, 10. Проверьте и убедитесь, что сумма элементов в списке равна 10. Вероятней всего у вас будут не такие цифры, как в примере (потому что они генерируются рандомно), но сумма чисел должна равняться количеству бросков. При повторном запуске программы с тем же количеством бросков вы увидите совершенно другой список.

Когда вы убедитесь, что программа работает хорошо, попробуйте задать большее количество попыток, например, 500, 1000, 5000. Какой элемент списка общего количества бросков будет самым большим для каждой ситуации? А самым маленьким?

7. Ваша задача: Напишите цикл с оператором for, который делит каждое значение в списке на число попыток. Отобразите результат. Каково значение этих чисел?

Начните со следующего выражения:

for i in range(11):

Возможно, вам будет удобно округлить длинные десятичные числа до меньшего количества разрядов. Какая функция для этого понадобится? Попробуйте функцию round(n, #places).

Примечание для учителя: Остальная часть кода выглядит так:

Последний список (десятичные числа) является экспериментальными вероятностями получения каждой суммы от 2 до 12. Вы можете использовать функцию round(n, #places), чтобы округлить десятичное число до меньшего количества разрядов.
Теоретическими вероятностями являются следующие цифры:
[1/36, 2/36, 3/36, 4/36, 5/36, 6/36, 5/36, 4/36, 3/36, 2/36, 1/36]