332 Глава 15 • Генерирование данных
from die import Die
# Создание двух кубиков D6.
die_1 = Die()
die_2 = Die()
# Моделирование серии бросков с сохранением результатов в списке.
results = []
for roll_num in range(1000):
result = die_1.roll() + die_2.roll()
results.append(result)
# Анализ результатов.
frequencies = []
max_result = die_1.num_sides + die_2.num_sides
for value in range(2, max_result+1):
frequency = results.count(value)
frequencies.append(frequency)
# Визуализация результатов.
hist = pygal.Bar()
hist.title = "Results of rolling two D6 dice 1000 times."
hist.x_labels = ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6 + D6', frequencies)
hist.render_to_file('dice_visual.svg')
Создав два экземпляра
Die
, мы бросаем кубики и вычисляем сумму для каждого
броска . Самый большой возможный результат (12) вычисляется суммировани-
ем наибольших результатов на обоих кубиках; мы сохраняем его в
max_result
.
Наименьший возможный результат равен сумме наименьших результатов на
обоих кубиках. В процессе анализа подсчитывается количество результатов для
каждого значения от 2 до
max_result
. (Также можно было использовать диапазон
range(2,
13)
, но он работал бы только для двух кубиков D6. При моделировании
реальных ситуаций лучше писать код, который легко адаптируется для разных
ситуаций. В частности, этот код позволяет смоделировать бросок пары кубиков
с любым количеством граней.)
При создании диаграммы мы задаем заголовок, метки оси x и серии данных .
(Если бы список
x_labels
был намного длиннее, то его было бы удобнее сгенери-
ровать автоматически в цикле.)
После выполнения кода обновите в браузере вкладку с диаграммой; примерный
вид диаграммы показан на рис. 15.12.
На диаграмме показаны примерные результаты, которые могут быть получены для
пары кубиков D6. Как видите, реже всего выпадают результаты 2 и 12, а чаще всего
7, потому что эта комбинация может быть выброшена шестью способами: 1+6, 2+5,
3+4, 4+3, 5+2 и 6+1.