Pygal簡單使用——模擬擲骰子

目錄

1、創建Die類

2、擲骰子

3、分析結果

4、繪製直方圖


在這個項目中,我們將對擲骰子的結果進行分析。擲6面的常規骰子時,可能出現的結果爲1~6點,且出現每種結果的可能性相同。 然而,如果同時擲兩個骰子,某些點數出現的可能性將比其他點數大。爲確定哪些點數出現的可能性最大,我們將生成一個表示擲骰子結果的數據集,並根據結果繪製出一個圖形。

下邊分步驟來實現模擬擲骰子的項目


1、創建Die類

下邊的類模擬投擲一個骰子(die.py):

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from random import randint
    class Die():
        """表示一個骰子的類"""
        def __init__(self, num_sides=6):
            """骰子默認爲6面"""
            self.num_sides = num_sides

        def roll(self):
            """"返回一個位於1和骰子面數之間的隨機值"""
            return randint(1, self.num_sides)

方法__init__() 接受一個可選參數。創建這個類的實例時,如果沒有指定任何實參,面數默認爲6;如果指定了實參,這個值將用於設置骰子的面數。骰子是根據面數命名的,6面的骰子名爲D6,8面的骰子名爲D8,以此類推。

方法roll() 使用函數randint()來返回一個1和麪數之間的隨機數。這個函數可能返回起始值1、終止值num_sides或這兩個值之間的任何整數。


2、擲骰子

擲D6骰子,將結果打印出來,並檢查結果是否合理(die_visual.py):

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from die import Die

# 創建一個D6
die = Die()

# 擲幾次骰子, 並將結果存儲在一個列表中
results = []
for roll_num in range(100):
    result = die.roll()
    results.append(result)
    print(results)

運行結果的一個示例:

[3, 5, 2, 1, 3, 3, 1, 5, 2, 6, 6, 4, 3, 5, 2, 4, 6, 6, 2, 5, 4, 3, 3, 1, 4, 3, 4, 1, 6, 3,
 2, 4, 5, 1, 1, 4, 2, 5, 1, 1, 5, 5, 3, 2, 4, 6, 4, 6, 1, 5, 5, 2, 5, 3, 5, 2, 5, 5, 3, 4, 
 2, 4, 4, 2, 3, 4, 2, 6, 1, 3, 3, 1, 3, 6, 3, 6, 3, 2, 6, 6, 2, 2, 2, 1, 1, 5, 1, 5, 3, 6, 
 5, 6, 1, 1, 5, 3, 4, 6, 6, 2]

3、分析結果

爲分析擲一個D6骰子的結果,我們計算每個點數出現的次數。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from die import Die
# 創建一個D6
die = Die()
# 擲幾次骰子, 並將結果存儲在一個列表中
results = []
for roll_num in range(100):
    result = die.roll()
    results.append(result)

# 分析結果
frequencies = []
for value in range(1, die.num_sides+1):
    frequency = results.count(value)
    frequencies.append(frequency)
    
print(frequencies)

運行結果(表示1~6分別出現的次數):


4、繪製直方圖

有了頻率列表後,我們就可以繪製一個表示結果的直方圖。直方圖 是一種條形圖,指出了各種結果出現的頻率。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from die import Die
import pygal

# 創建一個D6
die = Die()
# 擲幾次骰子, 並將結果存儲在一個列表中
results = []
for roll_num in range(1000):
    result = die.roll()
    results.append(result)

# 分析結果
frequencies = []
for value in range(1, die.num_sides+1):
    frequency = results.count(value)
    frequencies.append(frequency)

# 對結果進行可視化
hist = pygal.Bar()

# 設置直方圖的屬性
hist.title = "Results of rolling one D6 1000 times."  #設置直方圖標題
hist.x_labels = ['1', '2', '3', '4', '5', '6']  # 設置x軸座標值
hist.x_title = "Result"
hist.y_title = "Frequency of Result"  # 設置x,y座標軸標題

hist.add('D6', frequencies)
hist.render_to_file('die_visual.svg')

代碼解析:

  • 爲創建條形圖, 創建了一個pygal.Bar() 實例,並將其存儲在hist中
  • 設置hist 的屬性title(用於標示直方圖的字符串),hist.title = "Results of rolling one D6 1000 times."
  • 將擲D6骰子的可能結果用作x軸的標籤,hist.x_labels = ['1', '2', '3', '4', '5', '6']
  • 給每個軸都添加了標題,hist.x_title = "Result",hist.y_title = "Frequency of Result"
  • 我們使用add() 將一系列值添加到圖表中(向它傳遞要給添加的值指定的標籤, 還有一個列表, 其中包含將出現在圖表中的值),hist.add('D6', frequencies)
  • 將這個圖表渲染爲一個SVG文件, 這種文件的擴展名必須爲.svg。hist.render_to_file('die_visual.svg')
  • 要查看生成的直方圖,最簡單的方式是使用Web瀏覽器,打開文件die_visual.svg(它位於die_visual.py所在的文件夾中) 。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章