模拟掷骰子(Python)

只谈情不闲聊 提交于 2020-03-07 02:35:36

模拟掷骰子实际是抽取(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()

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!