使用rand()产生服从高斯/正态分布的随机数

我们借助于rand()去生成高斯/正态分布。

当然,rand是伪随机的问题在此先不考虑。

(1)用Box-Muller方法,随机抽出两个从均匀分布的数字和。然后

那 和 都是正态分布的。
证明可用极坐标,请参考教科书中的Box-Muller方法。

C代码:

#include 
#include 
#define PI 3.141592654double 
  double gaussrand( )
{
    static double U, V;
    static int phase = 0;
    double z;

    if(phase == 0)
    {
         U = rand() / (RAND_MAX + 1.0);
         V = rand() / (RAND_MAX + 1.0);
         Z = sqrt(-2.0 * log(U))* sin(2.0 * PI * V);
    }
    else
    {
         Z = sqrt(-2.0 * log(U)) * cos(2.0 * PI * V);
    }

    phase = 1 - phase;
    retrn Z;
}

这样生成的高斯分布随机数序列的期望为0.0,方差为1.0。若指定期望为E,方差为V,则只需增加:

 X= X * V + E;

Python代码:

import numpy as np
from scipy.special import erfinv

def boxmullersampling(mu=0, sigma=1, size=1):
    u = np.random.uniform(size=size)
    v = np.random.uniform(size=size)
    z = np.sqrt(-2*np.log(u))*np.cos(2*np.pi*v)
    return mu+z*sigma


(2)使用反函数,先随机抽出一个从均匀分布的数字,然后

那 是正态分布的。

Python代码:

import numpy as np
from scipy.special import erfinv
    
def inverfsampling(mu=0, sigma=1, size=1):
    z = np.sqrt(2)*erfinv(2*np.random.uniform(size=size)-1)
    return mu+z*sigma

你可能感兴趣的:(算法)