Python案例—掷骰子

NO.1

'''
    作者:Z_Howe
    版本:1.0
    功能:掷骰子实验:一个
    日期:2019/1/28
'''
import random

def roll_selec():
    select_num = random.randint(1,6)
    return select_num

def main():

    try_times = eval(input('请输入您要模拟投掷骰子的总次数:'))
    list_1 = [0] * 6
    for i in range(try_times):
        result = roll_selec()
        for j in range(1,7):
            if result == j:
                list_1[j - 1] += 1
    for k,x in enumerate(list_1):
        print('点数{}模拟的次数为{},概率为{}'.format(k+1,x,float(x/try_times)))

if __name__ == '__main__':
    main()

# 创新想法:想用类,但多次尝试失败,等会儿再想

模拟结果如下:
在这里插入图片描述
NO.2

'''
    作者:Z_Howe
    版本:2.0
    3.0新增功能:实现数据可视化
    功能:掷骰子实验:两个
    工具:使用zip()函数,形成映射 + numerate也是形成映射
    日期:2019/1/29
'''

import random
import matplotlib.pyplot as plt


def roll_select():
    select_num = random.randint(1,6)
    return select_num


def main():

    print()
    print('温馨提示:')
    print('鉴于可视化操作实现清晰性,请把输入的次数尽量调小!')
    print()
    try_times = eval(input('请输入您要模拟投掷骰子的总次数:'))
    dict_1 = dict(zip(list(range(2, 13)), [0]*11))
    result_list_1, result_list_2 = [], []

    for i in range(try_times):
        result_1, result_2 = roll_select(), roll_select()
        result_list_1.append(result_1)
        result_list_2.append(result_2)
        for j in range(2, 13):
            if (result_1 + result_2) == j:
                dict_1[j] += 1

    for k, r in dict_1.items():
        print('点数{}模拟的次数为{},概率为{}'.format(k, r, float(r/try_times)))

    # 数据可视化操作(使用matplotlib.pyplot模板)
    x = range(1, try_times+1)
    # 形成二维坐标图,并设置透明度
    # y轴不能进入循环,能遍历列表
    plt.scatter(x, result_list_1,alpha=1)
    plt.scatter(x, result_list_2,alpha=1)
    plt.show()

if __name__ == '__main__':
    main()

模拟结果如下图:

在这里插入图片描述
在这里插入图片描述
NO.3

'''
    作者:Z_Howe
    版本:2.0
    功能:掷骰子实验:两个
    3.0新增功能:实现数据可视化
    4.0新增功能:对结果进行简单的数据统计和分析,绘制直方图
        引用matplotlib.pyplot.hist(data, bins)
        data:数据列表   bins:分组边界
    工具:使用zip()函数,形成映射 + numerate也是形成映射
    日期:2019/1/29
'''

import random
import matplotlib.pyplot as plt

# 解决数据可视化操作的应用字符显示问题(一般是英文,现在改成中文)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


def roll_select():
    select_num = random.randint(1,6)
    return select_num


def main():

    print()
    print('温馨提示:')
    print('鉴于可视化操作实现清晰性,请把输入的次数尽量调小!')
    print()
    try_times = eval(input('请输入您要模拟投掷骰子的总次数:'))
    dict_1 = dict(zip(list(range(2, 13)), [0]*11))
    result_total = []

    for i in range(try_times):
        result_1, result_2 = roll_select(), roll_select()
        result_total.append(result_1+result_2)
        for j in range(2, 13):
            if (result_1 + result_2) == j:
                dict_1[j] += 1

    for k, r in dict_1.items():
        print('点数{}模拟的次数为{},概率为{}'.format(k, r, float(r/try_times)))
    # 数据可视化操作
    plt.hist(result_total, bins=range(2, 14), normed=1, edgecolor='black', linewidth=1)
    plt.title('骰子点数统计')
    plt.xlabel('点数')
    plt.ylabel('频率')
    plt.show()

if __name__ == '__main__':
    main()

模拟结果如下图所示:

在这里插入图片描述
在这里插入图片描述
NO.4

'''
    作者:Z_Howe
    版本:2.0
    功能:掷骰子实验:两个
    3.0新增功能:实现数据可视化
    4.0新增功能:对结果进行简单的数据统计和分析,绘制直方图
    5.0新增功能:使用科学计算库(NumPy:Numeric Python)简化程序,完善数据可视化结果
    工具:使用zip()函数,形成映射 + numerate也是形成映射
    日期:2019/1/29
    
    NumPy介绍(用Python实现的科学计算库):
            1.强大的N维数组对象array
            2.成熟的科学函数库
            3.实用的线性代数、随机数生成函数
    NumPy的操作对象是多维数组ndarray
        ndarray.shape 数组的维度
    创建数组:np.array(<list>), np.arange()...
    改变数组形状 reshape()
    NumPy创建随机数组:np.random.randint(a,b,size=(元组))
        创建[a,b)之间形状为size的数组
        如:
            import numpy as np
            arr = np.random.randint(1,10,(3,4))
            print(arr)
            
            [[7 8 3 2]
             [7 3 3 2]
             [1 4 3 2]]
             
    np.histogram()输出直方图的统计结果,可以多个
    matplotlib 绘图补充
    · plt.xticks()设置x坐标的坐标点位置及标签
    · plt.title()设置绘图标题
    · plt.xlabel(), plt.ylabel()设置坐标轴的标签
    
'''

import matplotlib.pyplot as plt
import numpy as np

# 解决数据可视化操作的应用字符显示问题(一般是英文,现在改成中文)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


def roll_select():
    select_num = random.randint(1,6)
    return select_num


def main():

    print()
    try_times = eval(input('请输入您要模拟投掷骰子的总次数:'))

    # 记录骰子的结果
    roll1_arr = np.random.randint(1, 7, (try_times, 1))
    roll2_arr = np.random.randint(1, 7, (try_times, 1))

    # 向量化操作:向量相加
    result_arr = roll1_arr+roll2_arr

    # bins是对应的range(2,14)的列举,而hist是每个点数对应的次数
    # 感觉histogram是一行一行读取矩阵
    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)

    # 定义每个坐标点上的名称
    tick_lables = ['2点', '3点', '4点', '5点', '6点',
                   '7点', '8点', '9点', '10点', '11点', '12点']
    tick_pos = np.arange(2, 13) + 0.5

    plt.xticks(tick_pos, tick_lables)
    plt.title('骰子点数统计')
    plt.xlabel('点数')
    plt.ylabel('频率')
    plt.show()

if __name__ == '__main__':
    main()

模拟结果如下图所示:
在这里插入图片描述

在这里插入图片描述

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值