小象学院—小象学院—Python学习联盟08—模拟掷骰子

案例描述:

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

小象学院—小象学院—Python学习联盟08—模拟掷骰子



版本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()

输出结果:

小象学院—小象学院—Python学习联盟08—模拟掷骰子



版本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()


小象学院—小象学院—Python学习联盟08—模拟掷骰子