怎样产生标准分布或高斯分布的随机数
2012-10-14 09:43
162 查看
这里有一个由 Marsaglia 首创 Knuth 推荐的方法:
以上代码是基于Box-Muller方法,基本思想是生成两组独立的随机数U和V,这两组数在(0,1]上均匀分布,用U和V生成两组独立的标准常态分布随机变量X和Y:
。
这个方程的提出是因为二自由度的卡方分布(见性质4)很容易由指数随机变量(方程中的lnU)生成。因而通过随机变量V可以选择一个均匀环绕圆圈的角度,用指数分布选择半径然后变换成(正态分布的)x,y坐标。
#include <stdlib.h> #include <math.h> double gaussrand() { static double V1, V2, S; static int phase = 0; double X; if(phase == 0) { do { double U1 = (double)rand() / RAND_MAX; double U2 = (double)rand() / RAND_MAX; V1 = 2 * U1 - 1; V2 = 2 * U2 - 1; S = V1 * V1 + V2 * V2; } while(S >= 1 || S == 0); X = V1 * sqrt(-2 * log(S) / S); } else X = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; return X; }
以上代码是基于Box-Muller方法,基本思想是生成两组独立的随机数U和V,这两组数在(0,1]上均匀分布,用U和V生成两组独立的标准常态分布随机变量X和Y:
。
这个方程的提出是因为二自由度的卡方分布(见性质4)很容易由指数随机变量(方程中的lnU)生成。因而通过随机变量V可以选择一个均匀环绕圆圈的角度,用指数分布选择半径然后变换成(正态分布的)x,y坐标。
相关文章推荐
- 怎样产生标准分布或高斯分布的随机数?
- 怎样产生标准分布或高斯分布的随机数?
- C语言产生标准正态分布或高斯分布随机数
- 产生特定分布的随机数(一):均匀分布和高斯分布
- 通过均匀分布随机数产生器获得一个高斯分布随机数产生器
- C#产生正态分布、泊松分布、指数分布、负指数分布随机数(原创)
- SQLSever: 怎样在select中的每一行产生不同的随机数?
- 均匀分布随机数产生的程序
- 数字信号产生之艾尔朗分布的随机数
- C语言/C++中怎样产生随机数
- 利用均匀分布和中心极限定理产生正态分布(高斯分布)
- C++中如何产生均匀分布的随机数
- 怎样在asp中产生10个0-99的随机数
- C语言/C++中怎样产生随机数
- 怎样根据自己的离散分布生成随机数
- 数字信号产生之贝努里分布的随机数
- C语言/C++中怎样产生随机数
- C语言/C++中怎样产生随机数
- c++/c 产生随机数(平均分布)
- C语言/C++中怎样产生随机数