案例描述:
- 通过计算机程序模拟掷骰子,并显示各点数出现次数及频率
- 比如,抛掷两个骰子50次,出现点数为7的次数是8,频率0.16
必备知识点:
- 如何通过python模拟随机事件?或者生成随机数?
random模块
- 遍历列表时,如何同时获取每个元素的索引号及其元素值:
enumerate()函数
具体代码:
版本1.0:模拟抛掷1个骰子,并输出其结果
'''
模拟掷骰子
版本1.0
'''
import random
def roll_dice():
'''
扔骰子的函数
'''
roll = random.randint(1,6)
return roll
def main():
total_time = int(input('输入抛掷骰子几次:'))
#初始化列表【0,0,0,0,0,0】记录出现点数的次数
result_list =[0]*6
for i in range(total_time):
roll = roll_dice()
for j in range(1,7):
if roll == j:
result_list[j-1] += 1
print(result_list)
if __name__ == '__main__':
main()
输出更详细的代码:
'''
模拟掷骰子
版本1.0
'''
import random
def roll_dice():
'''
扔骰子的函数
'''
roll = random.randint(1,6)
return roll
def main():
total_time = int(input('输入抛掷骰子几次:'))
#初始化列表【0,0,0,0,0,0】记录出现点数的次数
result_list =[0]*6
for i in range(total_time):
roll = roll_dice()
for j in range(1,7):
if roll == j:
result_list[j-1] += 1
#输出索引号和内容。
for k,m in enumerate(result_list):
print('点数:{},次数{},频率:{}'.format(k+1,m,m/total_time))
if __name__ == '__main__':
main()
版本2.0:模拟抛掷两个骰子,并输出结果。(输出两个骰子点数和)
- 如何将对应的点数和次数关联起来?
用字典的形式
- zip函数:zip()函数用于将对应的元素打包成一个元组
- 注意:元组中的元素是不可修改的,若要修改需要转换成字典或其他
- dict(zip(l1,l2))
代码:
'''
模拟掷骰子
版本2.0
'''
import random
def roll_dice():
'''
扔骰子的函数
'''
roll = random.randint(1,6)
return roll
def main():
total_time = int(input('输入抛掷骰子几次:'))
#初始化列表
result_list = [0]*11 #次数列表,点数2-12,共11种可能
roll_list = list(range(2,13)) #点数和列表.range不包含后一位,即不包含13
roll_dict = dict(zip(roll_list, result_list))
for i in range(total_time):
roll1 = roll_dice()
roll2 = roll_dice()
for j in range(2,13): #range不包含后一位,即不包含13
if (roll1+roll2) == j:
roll_dict[j] += 1
#字典的遍历与输出
for i,result in roll_dict.items():
print('骰子点数:{},次数{},频率:{}'.format(i,result,result/total_time))
if __name__ == '__main__':
main()
版本3.0:可视化掷骰子结果
- python数据可视化:matplotlib模块
具体代码:
'''
模拟掷骰子
版本3.0
'''
import random
import matplotlib.pyplot as plt
def roll_dice():
'''
扔骰子的函数
'''
roll = random.randint(1,6)
return roll
def main():
total_time = int(input('输入抛掷骰子几次:'))
#初始化列表
result_list = [0]*11 #次数列表,点数2-12,共11种可能
roll_list = list(range(2,13)) #点数和列表.range不包含后一位,即不包含13
roll_dict = dict(zip(roll_list, result_list))
#记录骰子结果
roll1_list = []
roll2_list = []
for i in range(total_time):
roll1 = roll_dice()
roll2 = roll_dice()
roll1_list.append(roll1)
roll2_list.append(roll2)
for j in range(2,13): #range不包含后一位,即不包含13
if (roll1+roll2) == j:
roll_dict[j] += 1
#字典的遍历与输出
for i,result in roll_dict.items():
print('骰子点数:{},次数{},频率:{}'.format(i,result,result/total_time))
#数据可视化
x = range(1,total_time+1)
plt.scatter(x, roll1_list, c='red', alpha=0.5) #设置透明度0.5
plt.scatter(x, roll2_list, c='green', alpha=0.5) #c=''设置颜色
plt.show()
if __name__ == '__main__':
main()
版本4.0:对抛掷结果进行简单的数据统计和分析(采用直方图)
直方图:
matplotlib绘制直方图
plt.hist(data,bins)
data:数据列表
bins:分组边界
具体代码:
'''
模拟掷骰子
版本4.0
'''
import random
import matplotlib.pyplot as plt
#更改绘图的语言,将负号变成False。(利用中文对图片进行标注,解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def roll_dice():
'''
扔骰子的函数
'''
roll = random.randint(1,6)
return roll
def main():
total_time = int(input('输入抛掷骰子几次:'))
#记录骰子结果
roll_list = []
for i in range(total_time):
roll1 = roll_dice()
roll2 = roll_dice()
roll_list.append(roll1+roll2)
for j in range(2,13): #range不包含后一位,即不包含13
if (roll1+roll2) == j:
roll_dict[j] += 1
#字典的遍历与输出
for i,result in roll_dict.items():
print('骰子点数:{},次数{},频率:{}'.format(i,result,result/total_time))
#直方图
plt.hist( roll_list,range(2,14),normed=1,edgecolor='black',linewidth=1)
#edgecolor指定边界的颜色。linewidth指定边界的宽度
#normed归一化。求频率,即频率总和为1
plt.title('骰子点数统计')
plt.xlabel('点数')
plt.ylabel('频率')
plt.show()
if __name__ == '__main__':
main()
输出结果:
版本5.0:使用科学计算库Numpy简化程序,完善数据可视化结果
np.histogram()输出直方图的统计结果。
具体代码:
'''
模拟掷骰子
版本5.0
'''
import numpy as np
import matplotlib.pyplot as plt
#更改绘图的语言,将负号变成False。(利用中文对图片进行标注,解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def main():
total_time = int(input('输入抛掷骰子几次:'))
#记录骰子结果
roll1_arr = np.random.randint(1, 7, size=total_time)
roll2_arr = np.random.randint(1, 7, size=total_time)
result_arr = roll1_arr +roll2_arr
hist, bins = np.histogram(result_arr,bins=range(2,14))
print(hist)
print(bins)
#数据可视化(直方图)
plt.hist( result_arr,range(2,14),edgecolor='black',linewidth=1,rwidth=0.8)
#edgecolor指定边界的颜色。linewidth指定边界的宽度。rwidth宽度
#normed归一化。求频率,即频率总和为1
#设置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()