蒙特卡洛算法的基本思想是:为了求解问题,首先建立一个概率模型或随机过程,使它的参数或数字特征等于问题的解:然后通过对模型或过程的观察或抽样试验来计算这些参数或数字特征,最后给出所求解的近似值。解的精确度用估计值的标准误差来表示。蒙特卡洛算法的主要理论基础是概率统计理论,主要手段是随机抽样、统计试验。用蒙特卡洛算法求解实际问题的基本步骤为:
(1)根据实际问题的特点.构造简单而又便于实现的概率统计模型.使所求的解恰好是所求问题的概率分布或数学期望;
(2)给出模型中各种不同分布随机变量的抽样方法;
(3)统计处理模拟结果,给出问题解的统计估计值和精度估计值。
蒙特卡洛算法的起源是著名的蒲丰实验。
蒲丰实验是用抛针的方法求圆周率的一个实验,其所蕴含的科学思想非常经典。
桌上有一组平行线,相邻两条间距为l,现有大量长为a(a<=l)的细针,抛掷于桌上。设其与桌上某一平行线相交的概率为P。进行实验,投掷M根细针后有N根与平行线相(M很大),于是可以用频率替代概率,即P=N/M。接下来从数学模型上分析P的值。
这样就完成了蒲丰实验。以大量重复实验中的频率代替数学或者统计学意义上的概率,是蒙特卡洛算法的核心。下面附上对蒲丰实验的代码实现:
from math import *
import random
l=float(input())
a=float(input())
s=0
N=0
M=int(input())
while s<=M:
x=random.uniform(0,l/2)
Phi=random.uniform(0,pi)
if x<=1/2*a*sin(Phi):
N+=1
s+=1
p=2*a*M/l/N
print(p)
平行线间距和针长可以自选,针的数量M要适中:M太小精度差别太大,M太大计算时间太长,一般来说M越大,与pi的真实值相差就越小。下面是三组数据:
但是为什么这个4000000的数据似乎没有1000000的数据精准呢?于是我又做了一遍:
这一次更精准了,前面那一次或许是随机数导致的小概率事件吧!
希望这篇文章对你有所帮助!~~