求C++语言编程生成满足正态分布(期望为2,方差为10)在0~5区间上的随机数程序
发布网友
发布时间:2022-05-21 15:50
我来回答
共1个回答
热心网友
时间:2023-11-01 03:08
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#define pi 3.1415926535897
// 区间[min,max]上的均匀分布,min和max要求传入的参数类型一致
template <class T>
T rand(T min, T max)
{
return min + (max - min) * rand() / (RAND_MAX + 1.0);
}
// 求均值为miu,方差为sigma的正太分布函数在x处的函数值
double normal(double x, double miu,double sigma)
{
return 1.0 / sqrt(2.0 * pi) / sigma * exp(-1.0 * (x - miu) * (x - miu) / (2.0 * sigma * sigma));
}
//按照矩形区域在函数值曲线上下位置分布情况得到正太函数x值
double randn(double miu, double sigma, double min , double max)
{
double x, y, dScope;
do
{
x = rand(min,max);
y = normal(x,miu,sigma);
dScope = rand(0.0, normal(miu,miu,sigma));
}
while(dScope > y);
return x;
}
// 简单算法,实际结果和公式法差不多
#define rd (rand()/(RAND_MAX+1.0))
double randn(double miu, double sigma)
{
return (rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd + rd - 6.0) * 0.5 * sigma + miu;
}
void main()
{
int i;
srand((unsigned)time( NULL ));
for (i = 0; i < 128; i++)
{
printf("%f%c", randn(2.0, 0.4), (i % 8 == 7) ? '\n' : ' ');
}
printf("\n");
for (i = 0; i < 128; i++)
{
printf("%f%c", randn(2.0, 0.4, 0.0, 4.0), (i % 8 == 7) ? '\n' : ' ');
}
printf("\n");
}