C语言实现正态分布或高斯分布

box-muller

概述

  Box-Muller,算法隐含的原理非常深奥,但结果却是相当简单。一般是要得到服从正态分布的随机数,基本思想是先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。

方法

  如果在 (0,1] 值域内有两个独立的随机数字 U1 和 U2,
  
  可以使用以下两个等式中的任一个算出一个正态分布的随机数字 Z:
  
  Z = R * cos( θ )
  或
  Z = R * sin( θ )
  
  其中,
  R = sqrt(-2 * ln(U2))
  
  θ = 2 * π * U1
  
  正态值 Z 有一个等于 0 的平均值和一个等于 1 的标准偏差,可使用以下等式将 Z 映射到一个平均值为 m、标准偏差为 sd 的统计量 X:
  
  X = m + (Z * sd)

#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;
}

参考地址:百度百科
参考博文:Tsingke http://www.cnblogs.com/tsingke/p/6194737.html

你可能感兴趣的:(c语言)