生成随机数
- 包含头文件
cstdlib
,从而可以使用srand
和rand
- 包含头文件
ctime
,从而可以使用time
srand
来设置随机种子:
srand(1)
每次产生的随机数都一样
srand(time(0))
或者srand(time(NULL))
在不同时刻运行程序时就会有不同的随机数
time(0)
返回从 1970-01-01 起的到当前时刻的秒数rand()%(b-a)+a
返回[a, b)之间的整数- float p = rand() % 1000 / (float)(1000); 生成0~1的小数
mt19937
C++的 rand() 函数产生的随机数范围值是 0~32767 ,如果想产生很大的随就要用到 mt19937 。
mt19937 num(seed);
定义了大随机数
生成均匀分布
uniform_int_distribution
整数均匀分布 全开
uniform_real_distribution
浮点数均匀分布 半开
#include<iostream>
#include<ctime>
#include<random>
using namespace std;
int main(){
static default_random_engine rng(time(NULL));
static uniform_real_distribution<double> distribution(0, 100);
cout<<distribution(rng);
}
为了避免多次调用同一对范围和引擎时每次生成的数都是一样的,需要在定义范围和引擎时将其定义为static的。
生成高斯分布
double gaussrand()
{
static double V1, V2, S;
static int phase = 0;
double X;
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;
return X;
}
若指定期望为E,方差为V,则只需增加:X = X * σ + μ;