Box-muller高斯随机数发生器&情节他的

时间:2018-05-23 16:46:32

标签: python random generator physics

我正在尝试使用Box-Muller方程在python中编写代码,但我不知道如何开始!

这是我想要解决的例子:

  
      
  • 在900keV下观察到的峰显示出2keV的FWHM。使用下面列出的高斯采样方法,生成对应于900 keV峰值的15,000个计数,并保存采样的能量。

  •   
  • 创建并绘制宽度为0.2 keV的直方图,并与具有相同峰面积的高斯函数进行比较。

  •   
  • 使用数据分析软件,尝试对蒙特卡罗数据进行高斯拟合,并看到结果与峰值模型足够接近。

  •   
     

Box-Muller高斯采样方法:   [注意,下面的两个采样变量y1,y2用于单位高斯分布(即mu = 0,segma = 1)。

y1 = (-2 ln r1)^1/2  * cos(2pi*r2)
y2 = (-2 ln r1)^1/2 * sin(2pi*r2)

   (r1, r2: random numbers)}

有什么建议吗?

*更新*

我收到错误消息:

  

g1 = BoxMuller(v)NameError:name' v'未定义

使用的代码是:

import random    
import matplotlib.pyplot as plt    
import numpy as np

def BoxMuller():    
    r1 = np.random.randn(15000)*10    
    r2 = np.random.randn(15000)    
    a = 2.0 * np.pi * r2        
    v = np.sqrt( -2.0*np.log(1.0 - r1)) * np.sin(a)        
    u = np.sqrt( -2.0*np.log(1.0 - r1)) * np.cos(a)

g1 = BoxMuller(v)
g2 = BoxMuller(u)
q = 900.0 + g1*2.0
k = 900.0 + g2*2.0
plt.hist(q, k)
plt.show()

1 个答案:

答案 0 :(得分:1)

嗯,这是启动和修补

的简单实现
import math
import random

def BoxMuller():
    r1 = random.random()
    r2 = random.random()

    a  = 2.0 * math.pi * r1
    v  = math.sqrt( -2.0*math.log(1.0 - r2))

    return (v * math.sin(a), v * math.cos(a))


g1, g2 = BoxMuller()

q = 900.0 + g1*2.0
...

更新

显然,有FWHM,而不是std.dev。要获得sigma,必须将FWHM除以2*sqrt(2*log(2)) ~2.355。所以采样代码应该是

FWHM = 2.0
q = 900.0 + g1 * FWHM/2.355