產生滿足正態分佈的隨機數

 一般有兩種算法:  
  算法一產生12個(0,1)平均分佈的隨機函數,用大數定理可以模擬出正態分佈。  
  算法二用到了數學中的雅可比變換,直接生成正態分佈,但此算法在計算很大規模的數時 會出現溢出錯誤。
附加代碼:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  #include   <math.h>  
  #include   
<stdio.h>  
  #include   
<conio.h>  
  #include   
<stdlib.h>  
  #include   
<time.h>  

  
#define M_PI 3.14159265358979323846

  
double   _random(void)  
  
{  
    
int   a;  
    
double   r;  
   
    a
=rand()%32767;  
    r
=(a+0.00)/32767.00;  
   
    
return   r;  
   
  }
  
   
  
double   _sta(double   mu,double   sigma)  
  
{  
    
int   i;  
    
double   r,sum=0.0;  
   
    
if(sigma<=0.0)   {   printf("Sigma<=0.0   in   _sta!");   exit(1);   }  
    
for(i=1;i<=12;i++)  
    sum   
=   sum   +   _random();  
    r
=(sum-6.00)*sigma+mu;  
   
    
return   r;  
   
  }
  
   
  
double   _sta2(double   mu,double   sigma)  
  
{  
    
double   r1,r2;  
   
    r1
=_random();  
    r2
=_random();  
   
    
return   sqrt(-2*log(r1))*cos(2*M_PI*r2)*sigma+mu   ;  
   
  }
  
   
   
  
int   main()  
  
{  
  
int   i;  
  
double   mu,sigma;  
   
  srand(   (unsigned)time(   NULL   )   );  
  mu
=0.0;  
  sigma
=1.0;  
  printf(
"Algorithm   1:\n");  
  
for(i=0;i<10;i++)  
  printf(
"%lf\t",_sta(mu,sigma));  
  printf(
"Algorithm   2:\n");  
  
for(i=0;i<10;i++)  
  printf(
"%lf\t",_sta2(mu,sigma));  
  
return   0;  
   
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章