C/C++中有正态分布函数可调用吗?
请问c++库中 现成的正态函数可以调用吗?我想求个正态分布。
急,,,在线等!
[解决办法]
[解决办法]
[解决办法]
double AverageRandom(double min,double max)
{
if (max < min)
{
max = min;
}
int minInteger = (int)(min*10000);
int maxInteger = (int)((max+1)*10000);
int randInteger = rand()*rand();
int diffInteger = maxInteger - minInteger;
if (diffInteger <= 0)
{
diffInteger = 10000;
}
int resultInteger = randInteger % diffInteger + minInteger;
return resultInteger/10000.0;
}
double Normal(double x,double miu,double sigma) //概率密度函数
{
WM_STACKTRACK_WITH_PUSH_POP
return 1.0/(sqrt(2*M_PI)*sigma) * exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma));
}
double NormalRandom(double miu, double sigma,double min,double max)//产生正态分布随机数
{
double x;
double dScope;
double y;
int nCount = 0;
do
{
x = AverageRandom(min,max);
y = Normal(x, miu, sigma);
dScope = AverageRandom(0, Normal(miu,miu,sigma));
nCount ++;
}while( dScope > y && nCount < 10000);
return x;
}
[解决办法]
- C/C++ code
/**************************************************** 产生N=100个在(0,50)区间内满足对数正态分布的随机数/*****************************************************/#include <stdlib.h>#include <stdio.h>#include <math.h>#include <time.h>#define N 100 #define MAX 50#define MIN 0.1#define MIU 2#define SIGMA 1#define PI 3.14159double AverageRandom(double min,double max)//产生(min,max)之间均匀分布的随机数{ int MINnteger = (int)(min*10000); int MAXnteger = (int)(max*10000); int randInteger = rand()*rand(); int diffInteger = MAXnteger - MINnteger; int resultInteger = randInteger % diffInteger + MINnteger; return resultInteger/10000.0;}double LogNormal(double x,double miu,double sigma) //对数正态分布概率密度函数{ return 1.0/(x*sqrt(2*PI)*sigma) * exp(-1*(log(x)-miu)*(log(x)-miu)/(2*sigma*sigma));}double Random_LogNormal(double miu,double sigma,double min,double max)//产生对数正态分布随机数{ double x; double dScope; double y; do { x = AverageRandom(min,max); y = LogNormal(x, miu, sigma); dScope = AverageRandom(0, LogNormal(miu,miu,sigma)); }while( dScope > y); return x;}void main(void){ srand(time(NULL)); int i,j; for(i=0,j=0;i<N;i++) { printf("%14f", Random_LogNormal(MIU,SIGMA,MIN,MAX)); j++; if(j==5) { printf("\n"); //每行显示5个数 j=0; } }}
[解决办法]
按照大数定理,多个均匀分布的随机变量之和呈现正态分布。
如果要求不高的话,比如对于游戏,三个均匀分布之和就够了,至少看起来不错。
[解决办法]