C++生成随机数:正态分布(normal distribution)
2013-01-27 20:35
501 查看
首次写博客,见谅!
win32控制台程序
这样生成的高斯分布随机数序列的期望为0.0,方差为1.0。若指定期望为E,方差为V,则只需增加:
X = X * σ + μ;
向屏幕输出 期望为0.0,方差为1.0的正态分布数据 100个
在此感谢博友:yeahgis
博客链接:http://www.cnblogs.com/yeahgis/archive/2012/07/13/2590485.html#2608670
////////////////////////////////////////////////////////////////////////////分割线 2014/02/19
以上代码生产均值:mean,标准差:std的10000个正态分布随机数。
(注意:在进行随机数生成过程中尽量不要使用其他代码影响随机数的生成过程,一下代码不可取)
代码中的if else判断对随机数生产过程影响较大(可能是此判断过于复杂,在此存疑!)
win32控制台程序
#include "stdafx.h" #include <stdio.h> #include <iostream> #include <time.h> #include <stdlib.h> #include <math.h> using namespace std; double gaussrand() { static double V1, V2, S; static int phase = 0; double X; double a[100]; srand((unsigned)time(NULL)); for (int i = 0; i<100; i++) { if ( phase == 0 ) { do { double U1 = (double)rand() / RAND_MAX; 26 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; //X = X * 0.04 + 40; a[i] = X; cout<<a[i]<<endl; } return 0; } int main(int argc, char* argv[]) { gaussrand(); return 0; }
这样生成的高斯分布随机数序列的期望为0.0,方差为1.0。若指定期望为E,方差为V,则只需增加:
X = X * σ + μ;
向屏幕输出 期望为0.0,方差为1.0的正态分布数据 100个
在此感谢博友:yeahgis
博客链接:http://www.cnblogs.com/yeahgis/archive/2012/07/13/2590485.html#2608670
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); X = X * std + mean;
////////////////////////////////////////////////////////////////////////////分割线 2014/02/19
static double V1, V2, S; static int phase = 0; double X; srand((unsigned)time(NULL)); for (int i = 0; i<10000; i++) { 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; X = X * std + mean; if(index != 5) { b[i] = b[i] - X; } else { b[i] = b[i] + X; } //a[i] = X; }
以上代码生产均值:mean,标准差:std的10000个正态分布随机数。
(注意:在进行随机数生成过程中尽量不要使用其他代码影响随机数的生成过程,一下代码不可取)
static double V1, V2, S; static int phase = 0; double X1; X1 = 0.0; int i; srand((unsigned)time(NULL)); //srand((unsigned int)time(&now)/(j+1)); for (i = 0; i<10000; i++) { 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); X1 = V1 * sqrt(-2 * log(S) / S); } else X1 = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; //X1 = X1 * 0.04 + 40; X1 = X1 * σ + μ; if(CString("减环") == m_Clist1.GetItemText(j,5)) { b[i] = b[i] - X1; } else if(CString("增环") == m_Clist1.GetItemText(j,5)) { b[i] = b[i] + X1; } }
代码中的if else判断对随机数生产过程影响较大(可能是此判断过于复杂,在此存疑!)
相关文章推荐
- C++生成随机数:高斯/正态分布(gaussian/normal distribution)
- 一种用C++自带的类生成服从正态分布的随机数。
- C++生成随机数:高斯/正态分布(gaussian/normal distribution)
- C++生成随机数:高斯/正态分布(gaussian/normal distribution)
- C++生成随机数
- C/C++生成固定范围随机数的问题
- C++ 随机数生成
- 【转】C++生成随机数——生成任意范围内的等概率随机数
- C++随机数生成方法
- C++随机数的生成
- c++随机数生成
- C++随机数生成器mt19937生成随机数的用法
- Excel生成满足正态分布的随机数
- c++生成随机数
- 【转】 C++生成随机数——生成任意范围内的等概率随机数
- 使用C++ 11自带的库函数生成随机数
- C/C++怎样生成确定范围的随机数(如[-1,1])
- 教你如何用C++快速生成1000万个随机数
- LeetCode:384. Shuffle an Array、随机数生成(C++)
- C++随机数生成方法(转载,赶紧搜藏)