1. 程式人生 > >簡單幾行C語言程式碼實現高斯分佈

簡單幾行C語言程式碼實現高斯分佈

由於專案需要產生一個高斯分佈,所以去網上查詢,結果很多,但是都沒有足夠的註釋或者原理講解,所以大部分程式碼都看不懂,也沒法確定程式碼的結果是否正確。因此想從原理上來解決這個問題。具體的理論推導請看 http://blog.sina.com.cn/s/blog_9ce5a1b501018c1g.html。 我這裡只是簡單的提供我測試這個原理的程式碼以及測試結果。測試是用MATLAB模擬的:

clear all;clc
N=500000;
mu   =0;  %高斯均值
theda=1; %高斯方差
%產生兩個均勻分佈的0~1的隨機序列
t1=rand(1,N);
t2=rand(1,N);
%極座標的兩個隨機變數分佈序列
a = 2*pi*t1;            %a是極座標的角度:變成了0~2*pi的均勻分佈
r = sqrt(-2*log(t2));   %r是極座標的距離:
%用極座標(a,r)轉換成笛卡爾座標(x,y),這裡x,y都符合高斯分佈
for i=1:N
    x(i) = mu+sqrt(theda)*r(i)*cos(a(i));
    y(i) = mu+sqrt(theda)*r(i)*sin(a(i));
end
x = 10*x;
mi = floor(min(x));
ma = ceil(max(x));
len= abs(mi)+abs(ma)+1;
array = zeros(1,len);
for i=1:N
    array(floor(x(i))-mi+1) = array(floor(x(i))-mi+1)+1;
end

plot(mi:1:ma,array);

執行結果:


然後根據上面的處理過程寫了下面C語言程式碼:

//用C語言實現高斯分佈

#include "math.h
#include "stdio.h"
#include "stdlib.h"

#define pi 3.14159

double GuassGenerate(double mu, double theda)
//mu為均值,theda為方差
{
double t1,t2,a,r;
  double x;
  /*產生兩個均勻分佈的0~1的隨機序列*/
  t1 = rand()/(RAND_MAX);
  t2 = rand()/(RAND_MAX);
  /*極座標的兩個隨機變數分佈序列*/
  a = 2*pi*t1;            //a是極座標的角度:變成了0~2*pi的均勻分佈
  r = sqrt(-2*log(t2));   //r是極座標的距離:變成自然對數開根號的一種分佈
  /*用極座標(a,r)轉換成笛卡爾座標(x,y),這就是產生的高斯白噪聲*/
  x = r*cos(a);

  return mu+theda*x;
}


void Gauss(double gs[], int lengh, double mu, double theda)
{
    for(int i=0;i<lengh;i++)
        gs[i]=GaussGenerate(mu,theda);
}