随机模拟又称Monte-Carlo方法,是一种基于“随机数”的计算方法。该方法在上个世纪,是十大算法之一。
随机模拟我们可以理解为:让计算机去扔骰子,最基本的在于随机数的生成。
接受-拒绝法的思想可以形象地比喻为制作沙雕,经历由粗到细的雕琢过程。
其缺陷在于效率较低,由于算法要随机地拒绝许多建议的随机数,根据算法效率,我们估计迭代N次后最终会得到随机数的数量大约是N/M。选择合适的建议概率密度函数g(x)是算法的关键。
在完全使Mg(x)罩住f(x)的前提下,g(x)选择的原则是:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
r=1.0
a,b=(0.0,0.0)
xmin,xmax=a-r,a+r
ymin,ymax=b-r,b+r
n=10000
x=np.random.uniform(xmin,xmax,n)
y=np.random.uniform(ymin,ymax,n)
fig=plt.figure(figsize=(6,6))
axes=fig.add_subplot(1,1,1)
plt.plot(x,y,'ro',markersize=1)
plt.axis('equal')
d=np.sqrt((x-a)**2 + (y-b)**2)
res=sum(np.where(d<r,1,0))
print('落在圆内的点有%i个' % res)
pi = 4*res/n
print("π的近似值为:",pi)
from matplotlib.patches import Circle
circle=Circle(xy=(a,b),radius=r,alpha=0.5,color='r')
axes.add_patch(circle)
plt.grid(True,linestyle='--',linewidth='0.5')