簡單幾行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);
}