模拟掷骰子实际是抽取(1~6之间的)随机数问题,涉及random模块,后面版本的数据可视化主要应用matplotlib.pyplot模块。
1.0:模拟一个骰子的结果。首先定义roll_dice()函数,从1~6之间随机抽取一个整数作为掷骰子的结果。在主函数中定义一个长度为6的列表(初始值为0),记录每个点出现的次数。每次掷完骰子都进行判断,掷出的点数在对应的列表位置上的元素加1。enumerate()函数将列表索引与对应的元素一一对应起来。
"""
模拟掷骰子
1.0:输出结果为掷骰子的频数与频率
"""
import random
def roll_dice():
"""
模拟掷骰子
:return: 返回一个1-6之间的随机数
"""
roll = random.randint(1,6)
return roll
def main():
Times = 10000
result_list = [0] * 6
for i in range(Times):
roll = roll_dice()
for j in range(1,7):
if roll == j:
result_list[j-1] += 1
for k,result in enumerate(result_list):
print ("掷得数字{},次数为{},频率为{}".format(k+1,result,result/Times))
if __name__=="__main__":
main()
2.0:模拟掷两个骰子的结果。与1.0不同的是,2.0定义两个列表,一个记录点数,一个记录点数出现的次数。zip()函数对两个列表进行组合,以元组的形式输出,dict(zip())函数将两个列表的元素以字典的形式输出。
"""
模拟掷骰子
2.0:模拟掷两个骰子的结果
"""
import random
def roll_dice():
"""
模拟掷骰子
:return: 返回一个1-6之间的随机数
"""
roll = random.randint(1,6)
return roll
def main():
Times = 1000
result_list = [0] * 11
roll_list = list(range(2,13))
roll_dict = dict(zip(roll_list,result_list))
for i in range(Times):
roll1 = roll_dice()
roll2 = roll_dice()
for j in range(2,13):
if roll1 + roll2 == j:
roll_dict[j] += 1
for k,result in roll_dict.items():
print ("掷得数字{},次数为{},频率为{}".format(k,result,result/Times))
if __name__=="__main__":
main()
3.0:将两个骰子的结果用散点图可视化,这里要用到matplotlib.python库。为了便于将两个骰子的结果分别可视化,定义连个列表,分别记录每个骰子的结果。plt.scatter()函数中的参数alpha表示透明度。
"""
模拟掷骰子
3.0:将掷两个骰子的结果可视化
"""
import random
import matplotlib.pyplot as plt
def roll_dice():
"""
模拟掷骰子
:return: 返回一个1-6之间的随机数
"""
roll = random.randint(1,6)
return roll
def main():
Times = 10
result_list = [0] * 11
roll_list = list(range(2,13))
roll_dict = dict(zip(roll_list,result_list))
roll1_result = []
roll2_result = []
for i in range(Times):
roll1 = roll_dice()
roll1_result.append(roll1)
roll2 = roll_dice()
roll2_result.append(roll2)
for j in range(2,13):
if roll1 + roll2 == j:
roll_dict[j] += 1
for k,result in roll_dict.items():
print ("掷得数字{},次数为{},频率为{}".format(k,result,result/Times))
#数据可视化
plt.scatter(range(Times),roll1_result,alpha=0.5,c="red")
plt.scatter(range(Times), roll2_result, alpha=0.5, c="green")
plt.show()
if __name__=="__main__":
main()
4.0:用直方图可视化掷骰子的结果。函数中的参数normed=1可将y轴显示为频率。
"""
模拟掷骰子
4.0:直方图可视化掷骰子结果
"""
import random
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
def roll_dice():
"""
模拟掷骰子
:return: 返回一个1-6之间的随机数
"""
roll = random.randint(1,6)
return roll
def main():
Times = 1000
roll_list = []
for i in range(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)
plt.title ("掷骰子结果")
plt.xlabel("点数")
plt.ylabel("频率")
plt.show()
if __name__=="__main__":
main()
5.0:涉及科学计算numpy库。在numpy中的列表可直接相加。
"""
模拟掷骰子
4.0:科学计算
"""
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
def main():
Times = 1000
roll_list = []
roll1 = np.random.randint(1,7,size=Times)
roll2 = np.random.randint(1,7, size=Times)
roll_list = roll1 + roll2
plt.hist(roll_list, bins=range(2,14), normed=1,edgecolor="black",linewidth=1,rwidth=0.8)
plt.title ("掷骰子结果")
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.xlabel("点数")
plt.ylabel("频率")
plt.show()
if __name__=="__main__":
main()