Bootstrap

Python小程序(7)--模拟掷骰子

案例描述
• 通过计算机程序模拟抛掷骰子,并显示各点数的出现次数及频率
• 比如,抛掷2个骰子50次,出现点数为7的次数是8,频率是0.16

版本1.0

1.0功能:模拟抛掷1个骰子,并输出其结果

如何通过Python模拟随机事件?或者生成随机数?
• random模块
• 遍历列表时,如何同时获取每个元素的索引号及其元素值?
• enumerate()函数

更多random模块的方法请参考:
https://docs.python.org/3/library/random.html

'''
功能:模拟掷骰子
版本:1.0
'''
import random
def roll_dice():
    '''
    模拟掷骰子
    '''
    roll = random.randint(1,6)
    return roll

def main():
    total_times = 10
    #初始化列表[0,0,0,0,0,0]
    result_list = [0] * 6

    for i in range(total_times ):
        roll = roll_dice()
        for j in range(1,7):
            if roll == j:
                result_list [j-1] += 1
    for i, result in enumerate(result_list):
        print('点数{}的次数:{},频率:{}'.format(i + 1, result, result / total_times))
if __name__ == '__main__':
    main()

 版本2.0

功能:模拟抛掷2个骰子,并输出其结果

如何将对应的点数和次数关联起来?
• zip()函数

'''
功能:模拟掷骰子
版本:2.0
'''
import random
def roll_dice():
    '''
    模拟掷骰子
    '''
    roll = random.randint(1,6)
    return roll

def main():
    total_times = 100
    #初始化列表[0,0,0,0,0,0]
    result_list = [0] * 11

    #初始化点数列表
    roll_list = list(range(2,13))

    roll_dict = dict(zip(roll_list ,result_list ))  #元组结构

    for i in range(total_times ):
        roll1 = roll_dice()
        roll2 = roll_dice()

        for j in range(2,13):
            if (roll1+roll2) == j:
                roll_dict[j] += 1
    #遍历列表
    for i, result in roll_dict.items():
        print('点数{}的次数:{},频率:{}'.format(i, result, result / total_times))
if __name__ == '__main__':
    main()

版本3.0

功能:可视化抛掷2个骰子的结果

Python数据可视化
• matplotlib模块

matplotlib是一个数据可视化函数库
• matplotlib的子模块pyplot提供了2D图表制作的基本函数
• 例子:https://matplotlib.org/gallery.html

'''
功能:模拟掷骰子
版本:3.0
'''
import random
import matplotlib.pyplot as plt
def roll_dice():
    '''
    模拟掷骰子
    '''
    roll = random.randint(1,6)
    return roll

def main():
    total_times = 100
    #初始化列表[0,0,0,0,0,0]
    result_list = [0] * 11

    #初始化点数列表
    roll_list = list(range(2,13))

    roll_dict = dict(zip(roll_list ,result_list ))  #元组结构
    # 记录骰子的结果
    roll1_list = []
    roll2_list = []
    for i in range(total_times ):
        roll1 = roll_dice()
        roll2 = roll_dice()
        roll1_list.append(roll1)
        roll2_list.append(roll2)
        for j in range(2,13):
            if (roll1+roll2) == j:
                roll_dict[j] += 1
    #遍历列表
    for i, result in roll_dict.items():
        print('点数{}的次数:{},频率:{}'.format(i, result, result / total_times))

    #数据可视化
    x = range(1,total_times +1)
    plt.scatter (x,roll1_list ,c='red',alpha = 0.5)  #alpha:透明度 c:颜色
    plt.scatter (x, roll2_list, c='green',alpha=0.5)
    plt.show()
if __name__ == '__main__':
    main()

 

 版本4.0

功能:对结果进行简单的数据统计和分析

简单的数据统计分析
• matplotlib直方图

'''
功能:模拟掷骰子
版本:4.0
'''
import random
import matplotlib.pyplot as plt
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  #SimHei黑体
plt.rcParams['axes.unicode_minus'] = False

def roll_dice():
    '''
    模拟掷骰子
    '''
    roll = random.randint(1,6)
    return roll

def main():
    total_times = 100
    # 记录骰子的结果
    roll_list=[]

    for i in range(total_times ):
        roll1 = roll_dice()
        roll2 = roll_dice()
        roll_list.append(roll1 + roll2)
    #数据可视化
    plt.hist(roll_list ,bins=range(2,14),normed= 1,edgecolor='black',linewidth=1)
            #edgeclor:边缘颜色   linewidth:边缘宽度  normed=1时转化为概率图
    plt.title('骰子点数统计')  #名称
    plt.xlabel('点数')
    plt.ylabel('频率')
    plt.show()
if __name__ == '__main__':
    main()

 

版本5.0 

功能:使用科学计算库简化程序,完善数据可视化结果

使用科学计算库NumPy简化程序

NumPy的操作对象是多维数组ndarray
• ndarray.shape 数组的维度
• 创建数组:np.array(<list>),np.arrange() …
• 改变数组形状 reshape()

NumPy创建随机数组
• np.random.randint(a, b, size)
创建 [a, b)间形状为size的数组

NumPy基本运算
• 以数组为对象进行基本运算,即向量化操作
• 例如:

 

np.histogram() 直接输出直方图统计结果 

 

matplotlib绘图补充
• plt.xticks() 设置x坐标的坐标点位置及标签
• plt.title()设置绘图标题
• plt.xlabel(), plt.ylabel() 设置坐标轴的标签

'''
功能:模拟掷骰子
版本:5.0
'''
import random
import matplotlib.pyplot as plt
import numpy as np
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  #SimHei黑体
plt.rcParams['axes.unicode_minus'] = False

def roll_dice():
    '''
    模拟掷骰子
    '''
    roll = random.randint(1,6)
    return roll

def main():
    total_times = 1000
    # 记录骰子的结果
    roll1_arr = np.random.randint(1,7,size=total_times)
    roll2_arr = np.random.randint(1, 7, size=total_times)
    result_arr = roll1_arr + roll2_arr
    # hist,bins = np.histogram(result_arr ,bins=range(2,14))
    # print(hist)
    # print(bins)
    #数据可视化
    plt.hist(result_arr  ,bins=range(2,14),normed= 1,edgecolor='black',linewidth=1,rwidth= 0.8)
            #edgeclor:边缘颜色   linewidth:边缘宽度  normed=1时转化为概率图  rwidth:柱子宽度
    #设置X轴坐标点
    tick_labels = ['2点', '3点', '4点', '5点',
                   '6点', '7点', '8点', '9点', '10点', '11点', '12点']
    tick_pos = np.arange(2, 13) + 0.5
    plt.xticks(tick_pos,tick_labels)

    plt.title('骰子点数统计')  #名称
    plt.xlabel('点数')
    plt.ylabel('频率')
    plt.show()
if __name__ == '__main__':
    main()

 

;