首页 > 其他 > 详细

蒙特卡罗方法(一):1.蒲丰投针求pi、2.掷骰子--求连续掷两颗骰子,点数之和大于6且第一次掷出的点数大于第二次掷出点数的概率

时间:2021-03-28 22:20:03      阅读:58      评论:0      收藏:0      [点我收藏+]

技术分享图片

第一小题:

1.计算量估计值
忽略快速的矩阵运算,花费的时间主要在number=109的循环中,每个循环中有3次基本运算,共有3*109次运算。

2.误差计算方法:
使用误差传递函数进行传递
技术分享图片
每进行一次试验后记录下投针相交概率值,最后计算出方差,代入上式,得到pi的误差值。

3.试验次数:number=109

"""
蒲丰投针求pi
马玉华 2020.9.24
"""
import numpy as np

def pufeng(a,l,number):

    phi = np.random.uniform(0,np.pi,number)
    lsin = l*np.sin(phi)
    x = np.random.uniform(0,a,number)
    p_list = []
    n = 0 # 定义相交次数n
    time = 0
    for i,j in zip(x,lsin):
        if i<=j:
            n = n+1
        time += 1
        p_list.append(n/time)
    p = n/number # 相交概率
    pi = 2*l/(a*p)
    return [pi,p_list]

def main():
    number = int(input(‘请输入投针次数(整数):‘))  # 定义实验次数number
    a = float(input(‘请输入平行线间距参数a的值:‘))
    l = float(input(‘请输入投针的长度参数l的值:‘))
    result = pufeng(a,l,number)
    print(‘圆周率pi为:‘,result[0])
    # 误差
    var = np.var(result[1])
    deviation = (2*l/a/result[1][-1])**2*var
    print(‘误差为:‘,deviation)

if __name__ == ‘__main__‘:
    main()

输出结果:

C:\Users\mayuhuaw\Anaconda3\python.exe E:/研究生课程/M-C方法在输运问题中的应用-考试编程/作业1:蒲丰投针、掷骰子/蒲丰投针.py
请输入投针次数(整数):10000000
请输入平行线间距参数a的值:4
请输入投针的长度参数l的值:3
圆周率pi为: 3.141834341129062
误差为: 3.1518377407091734e-06

进程已结束,退出代码 0

第二小题

事件理论概率值:
满足条件的事件有①第一次投掷4,第一次投掷3。②第一次投掷5,第一次投掷2、3、4。③第一次投掷6,第一次投掷1、2、3、4、5。
概率P=(1/6)(1/6)+(1/6)(3/6)+(1/6)(5/6)=1/4
1.计算量估计值
计算主要在number=107的循环中,每个循环中有3次基本运算,共有3
107次运算

2.误差计算方法:
记录下每次试验后的概率,最后计算出方差,在置信水平取0.95的条件下λ取1.96计算,使用λσ/sqrt(N)得到pi的误差值。

3.试验次数:number=10^7

"""
掷骰子:求连续掷两颗骰子,点数之和大于6且第一次掷出的点数大于第二次掷出点数的概率
马玉华   2020.9.25
"""
import numpy as np

def throw_dice(number):
    dice1 = np.random.randint(low=1,high=7,size=number)  # 第一次投骰子
    dice2 = np.random.randint(low=1,high=7,size=number)  # 第一次投骰子
    counter = 0      # 定义满足条件的次数,并作为返回值
    result_list =[]  # 定义每一次的试验结果列表
    for i,j in enumerate(zip(dice1,dice2)):   ## i为索引号,j为元组
        t1 = j[0]
        t2=j[1]
        if ((t1+t2)>6) and (t1>t2):
            counter += 1
        result_list.append(counter/(i+1))   # 把每次的概率结果存储到列表中
    return result_list

def main():
    number = int(input(‘请输入连续投掷试验的次数(投两个骰子算一次实验):‘))
    result_list = throw_dice(number)
    p = result_list[-1]
    print(‘概率值为:‘,p)
    # 误差,取λ为1.96
    deviation = 1.96*np.std(result_list)/np.sqrt(number)
    print(‘误差为:‘,deviation)
if __name__ == ‘__main__‘:
    main()

输出结果

C:\Users\mayuhuaw\Anaconda3\python.exe E:/研究生课程/M-C方法在输运问题中的应用-考试编程/作业1:蒲丰投针、掷骰子/掷骰子.py
请输入连续投掷试验的次数(投两个骰子算一次实验):100000000
概率值为: 0.2500297
误差为: 3.32377771312466e-08

进程已结束,退出代码 0

蒙特卡罗方法(一):1.蒲丰投针求pi、2.掷骰子--求连续掷两颗骰子,点数之和大于6且第一次掷出的点数大于第二次掷出点数的概率

原文:https://www.cnblogs.com/mayuhua/p/14589551.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!