您的位置:首页 > 编程语言 > C语言/C++

C++生成随机数:正态分布(normal distribution)

2013-01-27 20:35 501 查看
首次写博客,见谅!

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判断对随机数生产过程影响较大(可能是此判断过于复杂,在此存疑!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: