背景
c 11 在头文件 #include 中定义了随机数库,也可以使用 c 中生成随机数的方法。
c 生成随机数
概述
c 语言中使用 rand() 函数产生 0 ~ rand_max 范围内均匀分布到整数,其中 rand_max 是和系统相关的一个固定值。
#include
#include
srand(time(nullptr));//设置随机数种子
rand();//产生一个随机数
限定随机数范围
{
//产生 [0,b) 范围内到随机数
int randoxnumber = rand() % b ;
}
{
//产生 [a,b) 范围内到随机数
int randoxnumber = a rand() % ( b -a ) ;
}
{
//产生 [a,b] 范围内到随机数
int randoxnumber = a rand() % ( b -a 1 ) ;
}
{
//产生 [0,1] 范围内到随机小数
double randoxnumber =rand() / rand_max
}
{
//产生 [0,1) 范围内到随机小数
double randoxnumber =rand() / ( rand_max 1 )
}
c 中的随机数
概述
c 11 在头文件 #include 中定义了随机数库,包括随机数生成器和随机数分布器。
随机数生成器
①.概述
随机数生成器用来使用指定的种子产生一个随机数。
②.random_device
random_device 是标准库提供到一个非确定性随机数生成器,使用硬件作为随机数来源,故其调用代价较高,一般用来产生随机数种子。
random_device rd;
for (int i = 0; i < 10; i)
{
cout << rd() << endl;
}
③.default_random_engine
default_random_engine 是标准库提供的默认随机数生成器,其实现和编译器有关。
random_device rd;
default_random_engine r_eng(rd());
for (int i = 0; i < 10; i)
{
cout << r_eng() << endl;
}
④.minstd_rand
minstd_rand 是标准库提供的采用线性同余算法的伪随机数生成器。
random_device rd;
minstd_rand r_eng(rd());
for (int i = 0; i < 10; i)
{
cout << r_eng() << endl;
}
⑤.mt19937
mt19937 是标准库提供的采用梅森旋转算法的伪随机数生成器,可以快速产生高质量到随机数。
random_device rd;
mt19937 r_eng(rd());
for (int i = 0; i < 10; i)
{
cout << r_eng() << endl;
}
⑥.ranlux24_base
ranlux24_base 是标准库提供的采用带进位减法的伪随机数生成器。
random_device rd;
ranlux24_base r_eng(rd());
for (int i = 0; i < 10; i)
{
cout << r_eng() << endl;
}
随机数分布器
①.概述
随机数分布器用于限定生成随机数的范围及分布类型。
②.uniform_int_distribution
uniform_int_distribution 用于生成指定范围的均匀分布的整数。
random_device rd;//用于生成随机数种子
mt19937 r_eng(rd());//随机数生成器
uniform_int_distribution dis(1, 100);//随机数分布器 闭区间
for (int i = 0; i < 10; i)
{
cout << dis(r_eng) << endl;
}
③.uniform_real_distribution
uniform_real_distribution 用于生成指定范围的均匀分布的浮点数。
random_device rd;//用于生成随机数种子
mt19937 r_eng(rd());//随机数生成器
uniform_real_distribution dis(1, 100);//随机数分布器 闭区间
for (int i = 0; i < 10; i)
{
cout << dis(r_eng) << endl;
}
④.normal_distribution
normal_distribution 用于生成指定均值和方差的正态分布的浮点数。
random_device rd;//用于生成随机数种子
mt19937 r_eng(rd());//随机数生成器
normal_distribution <> dis(4, 1.5);//随机数分布器,均值、方差
for (int i = 0; i < 10; i)
{
cout << dis(r_eng) << endl;
}
⑤.bernoulli_distribution
bernoulli_distribution 用于生成二项分布到布尔值,可以指定 true 的概率。
random_device rd;//用于生成随机数种子
mt19937 r_eng(rd());//随机数生成器
bernoulli_distribution dis( 0.6);//随机数分布器,生成 1 的概率是 0.6
for (int i = 0; i < 10; i)
{
cout << dis(r_eng) << endl;
}
qt 中的随机数
概述
qt 中生成随机数的方法和 c 语言中差不多,对应到函数为 qsrand() 、qrand()。使用使需要包含头文件 #include 。
代码示例
auto seed = qdatetime::currentdatetime().tomsecssinceepoch();
qsrand(seed);
for (int i = 0; i < 10; i)
{
qdebug() << qrand() % 10;// 0 - 9 范围
}