使用 C / C++ 产生符合正态分布的随机数
来源:互联网 发布:cfa淘宝代报名靠谱吗 编辑:程序博客网 时间:2024/06/05 14:31
使用 C / C++ 产生符合正态分布的随机数
利用有box 和 muller 提供的,在 knuth的网上讨论过的方法 (比较常用的方法)
目的:Box-Muller,一般是要得到服从正态分布的随机数,
基本思想: 先得到服从均匀分布的随机数; 然后再将服从均匀分布的随机数转变为服从正态分布.
Box-Muller 是产生随机数的一种方法。Box-Muller 算法隐含的原理非常深奥,但结果却是相当简单。
如果在 (0,1] 值域内有两个一致的随机数字 U1 和 U2,
可以使用以下两个等式中的任一个算出一个正态分布的随机数字 Z:
Z = R * cos( θ ) 或 Z = R * sin( θ )
其中, R = sqrt(-2 * ln(U2)), θ = 2 * π * U1
正态值 Z 有一个等于 0 的平均值和一个等于 1 的标准偏差,可使用以下等式将 Z 映射到一个平均值为 m、标准偏差为 sd 的统计量 X: X = m + (Z * sd)
C语言代码
#include <stdlib.h>#include <stdio.h>#define PI 3.141592654double double gaussrand( ){ static double U, V; static int phase = 0; double z; if(phase == 0) { U = rand() / (RAND_MAX + 1.0); V = rand() / (RAND_MAX + 1.0); Z = sqrt(-2.0 * log(U))* sin(2.0 * PI * V); } else { Z = sqrt(-2.0 * log(U)) * cos(2.0 * PI * V); } phase = 1 - phase; retrn Z;}
C++代码
#include <cstdlib>#include <cmath>#include <limits>double generateGaussianNoise(double mu, double sigma){ const double epsilon = std::numeric_limits<double>::min(); const double two_pi = 2.0*3.14159265358979323846; static double z0, z1; static bool generate; generate = !generate; if (!generate) return z1 * sigma + mu; double u1, u2; do { u1 = rand() * (1.0 / RAND_MAX); u2 = rand() * (1.0 / RAND_MAX); } while ( u1 <= epsilon ); z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2); z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2); return z0 * sigma + mu;}
参考文章:http://www.cnblogs.com/tsingke/p/6194737.html
0 0
- 使用 C / C++ 产生符合正态分布的随机数
- C语言产生满足正态分布的随机数
- C语言产生满足正态分布的随机数
- C语言产生满足正态分布的随机数
- 使用Excel生成符合正态分布的随机数
- 如何用JAVA产生符合正态分布的随机数
- 正态分布随机数的产生
- 正态分布随机数的产生
- C++产生正态分布的随机数
- 产生满足正态分布的随机数
- 如何产生正态分布的随机数?
- 使用rand()产生服从高斯/正态分布的随机数
- 用C语言程序生成符合正态分布的随机数列
- C语言--生成正态分布随机数
- C语言随机数的产生
- C#中随机数的产生
- C语言随机数的产生
- C/C++随机数的产生
- PHP 日期时间 获取服务器当前时间、日期 全解析
- 技术面面试总结2
- 常见的25个python面试问答,让你顺利拿到offer!
- 杭电oj(java版)——1093 A+B for Input-Output Practice (V)
- Eclipse启动错误:java was started but returned exit code=1 (网上各种坑)
- 使用 C / C++ 产生符合正态分布的随机数
- 【种类并查集】 hdu1829 A bug's Life
- AndroidStudio-R文件突然爆红
- 二叉树的DFS/BFS
- Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to
- Error: L6218E: Undefined symbol main (referred from_rtentry2.0)
- LinkedTransferQueue 理解
- 杭电oj(java版)——1094
- 【MySQL基础】数据库概述