如何产生正态分布的随机数
正态分布的随机数
[解决办法]
有难度,帮你顶
[解决办法]
让随机数通过实现正态分布函数。
[解决办法]
void NormalTable(float *FTable, float * fTable,int Length)
/*
生成正态分布函数和正态分布概率密度函数表,表宽度为3倍方差
正态分布函数均值为0,方差为1
FTable: 正态分布函数表
fTable: 正态分布概率密度表
Length: 表的长度
*/
{
int i;
float h; /* 步长 */
float x,temp;
float C;
x=-3;
h= 6.0/Length/2;
FTable[0]=0;
C=1/sqrt(2*3.1415927);
/* 初始参数设置 */
fTable[0]= exp(-x*x/2)*C;
/* 起始点的概率密度 ,exp(-x*x/2)*C为概率密度函数 */
for(i=1;i<Length;i++)
{
x+=h;
temp = exp(-x*x/2)*C;
x+=h;
fTable[i] = exp(-x*x/2)*C;
/* 计算正态分布概率密度函数 */
FTable[i] = FTable[i-1]+(fTable[i-1]+4*temp+fTable[i])*h/3;
/* 辛普森数值积分公式计算正态分布函数 */
}
}
float NormalRNG(float * Gauss_F, int Length)
/*
生成均值为0,方差为1的高斯随机数
Gauss_F: 正态分布函数表,规格如上,可以由NormalTable函数生成
Length: 正态分布函数表的长度
返回值:均值为0,方差为1的高斯分布随机数
*/
{
float RandomNumber;
float temp,h;
int i;
h= 6.0/Length;
/* 正态分布表的步长 */
temp = (float)RNG()/65536;
/*产生一个[0,1)区间内均匀随机数 */
if(temp == 0)
return 0;
for(i=0;i<Length;i++)
{
if(temp<=Gauss_F[i]) /*计算随机数落入正态分布表的哪个区间 */
{
RandomNumber = (-3+h*i)+(temp-Gauss_F[i-1])/(Gauss_F[i]-Gauss_F[i-1])*h;
/* 进行线性差值 */
break;
}
}
return RandomNumber;
}
[解决办法]