定义
我们又可以称之为统计模拟方法,将所求解的问题同⼀定的概率模型相联系,⽤电⼦计算机实现统计模拟或抽样,以获得问题的近似解。
我们把需要求解的一个问题放到一个模型中,在模型中找出能近似表示这个值的特征。我们使用大量的随机数(这个随机数不仅仅指一个数,更广泛的指模型中发生的一次随机事件,我们将这个随机事件产生的效果简化为数,这个随机事件在这个模型产生的数值我们用随机数来代替)来模拟这个模型,随机数的数量越多,那么模拟的结果更加精确。
原理
由大数定理可知,当样本容量足够大时,事件的发生频率即为其概率。
布丰投针
一个经典的例子就是布丰投针,用于求解圆周率。
设我们有一个以平行且等距木纹铺成的地板,随意抛一支长度比木纹之间距离小的针,求针和其中一条木纹相交的概率。并以此概率来求解pi。
-
取一张白纸,在上面画上许多条间距为a的平行线。
-
取一根长度为l(l≤a) 的针,随机地向画有平行直线的纸上掷n次,观察针与直线相交的次数,记为m。
-
计算针与直线相交的概率,概率公式如下。
p = 2 l π a = m n p = \frac{2l}{\pi a} = \frac{m}{n} p=πa2l=nm
我们根据相交的次数来求解pi值。
matlab 模拟
我们现在需要将布丰投针这个模型里发生的投针试验简化为数据。
我们每一次投针的不同之处在于针与平行线之间的夹角c,以及针的中心与其最近的平行线的距离a。我们根据这两个值来判断针与线是否相交。
这样我们就找到了每一次投针试验后产生的数据
-
针与平行线之间的夹角c
-
针的中心与其最近的平行线的距离a
-
针与线是否相交,即下面的公式。
x ≤ l / 2 ∗ s i n ( c ) x \le l/2 * sin(c) x≤l/2∗sin(c)
length = 1;% 针的长度
a = 3; % 平行线距离
n = 5200000; % 投针试验的次数,n越大求出来的pi越准确
m = 0; % 用于记录针与平行线相交的次数
x = rand(1, n) * a / 2 ; % 针的中点和最近的一条平行线的距离
angle = rand(1, n) * pi; % 针和最近的一条平行线的夹角
for i=1:n
if x(i) <= length / 2 * sin(angle (i)) % 判断是否相交
m = m + 1;
end
end
p = m / n; % 针和平行线相交出现的频率
predict_pi = (2 * length) / (a * p);
disp(predict_pi)
% 3.1408