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次基本运算,共有3107次运算
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