posts - 134,comments - 22,trackbacks - 0

使用了 G. E. P. Box、M. E. Muller 和 G. Marsaglia 的极坐标法 (polar method)生成符合高斯分布的随机数

 1#include <time.h>
 2#include <stdio.h>
 3#include <stdlib.h>
 4#include <math.h>
 5
 6/*生成符合0-1均匀分布的随机数*/
 7double randf()
 8{
 9    return (double)rand()/RAND_MAX;
10}

11
12
13/* 高斯分布随机数生成器 */
14/* 均值 m, 标准差 s */
15double randomGaussian(double m, double s)    
16{                        
17    double x1, x2, w, y1;
18    static double y2;
19    static bool haveNext= false;
20
21    if (haveNext)                
22    {
23        y1 = y2;
24        haveNext = false;
25    }

26    else
27    {
28        do 
29        {
30            x1 = 2.0 * randf() - 1.0;
31            x2 = 2.0 * randf() - 1.0;
32            w = x1 * x1 + x2 * x2;
33        }

34        while ( w >= 1.0 || w==0);
35        
36        w = sqrt( (-2.0 * log( w ) ) / w );
37        y1 = x1 * w;
38        y2 = x2 * w;
39        haveNext = true;
40    }

41    
42    return( m + y1 * s );
43}

44
45void main()
46{
47    srand((unsigned)time( NULL )); //初始化随机种子
48
49    //生成10个服从均值为0  标准差为1的高斯分布的随机数
50    double tmp;
51
52    for(int i=0;i<10;i++)
53    {
54        tmp=randomGaussian(0,1);
55        printf("%f\n",tmp);
56    }

57}
结果图:

参考:http://www.taygeta.com/random/gaussian.html
posted on 2009-02-26 15:22 何克勤 阅读(1329) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: