随机数生成算法(整数、小数和正态分布)(附代码)
程序员文章站
2022-07-15 10:38:40
...
首先定义RandomNumber类的时候,我们就定义了一个构造函数,每次调用就会产生随着系统时间变化的随机种子,这样我们就可以避免生成伪随机数,小数和整数随机数的生成比较好理解,而服从正态分布的随机数本文采用的是Box–Muller算法,它可以通过两个服从(0,1)均匀分布的随机数构造服从正态分布的随机数。
Box-Muller算法
当x和y是两个独立且服从(0,1)均匀分布的随机变量时,有
Z1和Z2独立且服从标准正态分布,当带入均值和方差时,
Z就可以产生服从(μ,σ2)正态分布的随机数,本文采用的是Z1。
实例
设置随机产生20组(-100,100)的整数,(0,1)的小数,服从(0,1)正态分布的随机数
c++代码
#include <iostream>
#include <ctime>
#define PI 3.1415926535897 //π值
using namespace std;
//==========================随机产生均匀分布的小数、整数和服从高斯分布的随机数=========================
class RandomNumber
{
public:
RandomNumber() {
srand((unsigned)time(NULL)); //析构函数,在对象创建时数据成员执行初始化操作
}
int integer(int begin, int end)
{
return rand() % (end - begin + 1) + begin;
}
double decimal(double a, double b)
{
return double(rand() % 10000) / 10000 * (b - a) + a;
}
double GaussianNoise(double mu, double sigma)
{
return sigma * sqrt(-2 * log(decimal(0, 1)))*cos(2 * PI*(decimal(0, 1))) + mu;
}
};
int main()
{
RandomNumber r;//定义随机数
cout << " " << "整数" << " " << "小数" << " " << "服从(0,1)正态分布" << endl;
for (int i = 0; i < 20; i++)
{
cout << " " << r.integer(-100, 100) << " " << r.decimal(0, 1) << " " << r.GaussianNoise(0, 1) << endl;
}
}
上一篇: 牛客OJ:不用加减乘除法做加法
下一篇: 4.3 float、double类型介绍