案例描述
• 通过计算机程序模拟抛掷骰子,并显示各点数的出现次数及频率
• 比如,抛掷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()