Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1462967
  • 博文数量: 181
  • 博客积分: 3308
  • 博客等级: 中校
  • 技术积分: 2227
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-03 12:03
个人简介

我是zoro

文章分类

全部博文(181)

文章存档

2015年(1)

2013年(35)

2012年(39)

2011年(50)

2010年(56)

分类: LINUX

2013-02-06 14:20:14

转自:

本文介绍如何使用GNU科学计算库GSL(GNU Scientific Library)产生正态分布(高斯分布)、柯西分布和Levy分布的随机数。本文程序都在Linux下用GCC4.5编译通过。编译时请使用命令: gcc -Wall test.c -o -lgsl -lgslcblas test。并将你的/usr/local/lib/目录设置到库搜索路径中。

接,继续。

2. 产生满足正态分布(高斯分布)的随机数

默认的,GSL用Box-Muller方法产生满足正态分布的随机数。下面是一般会用到的函数。

Function 2.1 double gsl_ran_gaussian(const gsl_rng *r, double sigma)

函数返回期望(均值 μ)为 0 ,标准差为 sigma (σ) 的正态分布随机数。

Function 2.2 double gsl_ran_gaussian_pdf (double x, double sigma)

计算 x 处的概率密度值。

Function 2.3 double gsl_ran_ugaussian (const gsl_rng *r)

标准正态分布函数,与 Function 2.1 中的sigma=1时等价。

Function 2.4 double gsl_ran_ugaussian_pdf (double x)

返回标准正态分布的x处的概率密度函数值。

例子程序:

?Download 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include  #include  #include  #include    int main() { const gsl_rng_type *T; gsl_rng *r;   int i, n=5; double u;  
    T = gsl_rng_ranlxs0; gsl_rng_default_seed = ((unsigned long)(time(NULL))); r = gsl_rng_alloc(T);   for (i = 0; i<n ; i++) { u = gsl_ran_ugaussian(r); ("%.5f\n", u); }   ("gaussian_pdf(0.0)=%.5f\n", gsl_ran_ugaussian_pdf(0.0)); ("gaussian_pdf(1.0)=%.5f\n", gsl_ran_ugaussian_pdf(1.0)); ("gaussian_pdf(-1.0)=%.5f\n", gsl_ran_ugaussian_pdf(-1.0));  
    gsl_rng_free(r);   return 0; }

运行结果:

-1.55713
0.85295
-0.67320
-1.37006
1.21462
gaussian_pdf(0.0)=0.39894
gaussian_pdf(1.0)=0.24197
gaussian_pdf(-1.0)=0.24197

3. 产生满足柯西分布(Cauchy)的随机数

一篇文章提到过,柯西分布也是的一个特例,是当特性指数 α=1,偏度参数 β=0 时的稳定分布。所以对于柯西分布只有一个尺度因子 c 需要人工设定。

Function 3.1 double gsl_ran_cauchy(const gsl_rng *r, double a)

参数a就是尺度因子,函数返回满足柯西分布的随机数。

Function 3.2 double gsl_ran_cauchy_pdf(double x, double a)

返回x处的概率密度函数值。

例子程序:

?Download 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include  #include  #include  #include    int main() { const gsl_rng_type *T; gsl_rng *r;   int i, n=5; double u; double a;  
    T = gsl_rng_ranlxs0; gsl_rng_default_seed = ((unsigned long)(time(NULL))); r = gsl_rng_alloc(T); a = 1.0;   ("scale parameter a=%.1f\n", a); for (i = 0; i<n ; i++) { u = gsl_ran_cauchy(r, a); ("%.5f\n", u); }   ("cauchy_pdf(0.0, %.1f)=%.5f\n", a, gsl_ran_cauchy_pdf(0.0, a)); ("cauchy_pdf(1.0, %.1f)=%.5f\n", a, gsl_ran_cauchy_pdf(1.0, a)); ("cauchy_pdf(-1.0, %.1f)=%.5f\n", a, gsl_ran_cauchy_pdf(-1.0, a));  
    gsl_rng_free(r); return 0; }

运行结果:

scale parameter a=1.0
-0.44757
-0.12089
-2.67688
-1.61293
0.11825
cauchy_pdf(0.0, 1.0)=0.31831
cauchy_pdf(1.0, 1.0)=0.15915
cauchy_pdf(-1.0, 1.0)=0.15915

WP-CODEBOX

声明:文章未经说明都是原创,转载请注明: 转载自

本文链接地址: 



阅读(5631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~