蒙特卡罗方法下乘同余法生成随机数与蒲丰投针问题的实现

蒙特卡罗方法

随机数与随机变量的生成及在数值计算中的应用

  • 用随机(统计)模拟方法解决实际问题时,首先要解决的是随机数的产生方法,或者称随机变量的抽样方法。即如何从具有已知分布的总体中抽取简单子样,这在蒙特卡罗方法中占有非常重要的地位。
  • 在连续型随机变量的分布中,最简单而且最基本的分布是[0,1]上的均匀分布,也称为单位均匀分布。从该分布抽取的简单子样,称为随机数序列,其中每一个体成为随机数
  • 由于随机数在蒙特卡罗方法中占有极其重要的位置,我们用专门的符号ξ表示。由随机数序列的定义可知ξ1,ξ2,··· 是相互独立且服从单位均匀分布的随机数序列。也就是说,独立性,均匀性是随机数必备的两个特点。
  • 计算机方法:给定一个种子,根据递推公式计算整个随机数序列。由于给定初始值和递推公式后整个序列就被唯一确定了,因此利用计算机方法生成的随机数序列称为伪随机数
  • 在计算机上利用数学方法产生随机数的第一个随机数发生器是20世纪40年代出现的“平方取中法”;以后又出现“乘积取中法”、位移法、线性同余法,组合同余法、反馈位移寄存器方法等等。目前较流行的也是多数统计学家认为较好的随机数发生器为后三种。
  • 乘同余方法是由Lehmer在1951年提出来的,它的一般形式是:对于任一初始值的X1(称为随机数种子),伪随机数序列由下面递推公式确定:
    蒙特卡罗方法下乘同余法生成随机数与蒲丰投针问题的实现_第1张图片
import numpy as np
#采用乘同余方法生成随机数
N=10000
seed=123456789
M=2**32
a=513
randnum=np.zeros(N)
X=np.zeros(N)
X[0]=seed
for i in np.arange(1,N)
	X[i]=a*X[i-1]%M
randnum=X/M
import numpy as np
#l为针长度,d为平行线距离,N为模拟次数,m为计数器
l,d,N,m=1,2,10000000,0
#生成随机数序列
x=np.random.uniform(0,1,N)
p=np.random.uniform(0,np.pi,N)
for i in np.arange(N):
	if x[i]<0.5*np.sin(p[i]):
		m=m+1
pi_=N/m

蒙特卡罗方法下乘同余法生成随机数与蒲丰投针问题的实现_第2张图片
蒙特卡罗方法下乘同余法生成随机数与蒲丰投针问题的实现_第3张图片
PS:来源于天津财经大学统计学院

你可能感兴趣的:(python)