一、基本信息
C++标准库中包含一个随机数程序库,提供众多的class和type用来满足新手和专家对于随机数及其分布的需求。
首先介绍两个概念:
随机数引擎:引擎是随机性的源头。它们是function object,能够产生随机的无正负值,并均匀分布于一个预定义的最大和最小值之间。
分布:表示以何种手法,将引擎产生的随机值转换为随机数,随机数分布于一个由使用者给定的参数所决定的区间内。
之所以需要引擎,是因为在计算机中没有所谓真正的随机,你也许需要很多努力才能提供好的随机性,所以这就是引擎的作用。C++标准库提供16个随机数引擎,你可以用它们搭配某个分布来实现随机数,或用来重新“洗牌”。
因此:随机数 = 随机数引擎 + 分布
二、C++提供的16种随机数引擎
随机数引擎是一个带有状态的随机性源头,其状态决定了它将生成哪一个随机值序列,注意这并非随机数。每次以operator()调用它,就可以产出一个随机的无正负号值,并且内部状态改变,使得可以此后再产出一个新随机值。
1、默认引擎:default_random_engine
2、基础引擎:提供各种基本算法用以生成随机值
(1)std::linear_congruential_engine
(2)std::mersenne_twister_engine
(3)std::subtract_with_carry_engine
3、引擎适配器:根据一个基础引擎而初始化
(1)std::discard_block_engine
(2)std::independent_bits_engine
(3)std::shuffle_order_engine
4、适配器并带预定义参数:
(1)minstd_rand0
(2)minstd_rand
(3)mt19937
(4)mt19937_64
(5)ranlux24_base
(6)ranlux48_base
(7)ranlux24
(8)ranlux48
(9)knuth_b
三、C++提供的分布
所谓分布是把引擎产生的随机数转换为真实而有用的随机数。产出数的概率取决于使用何种分布,后者可根据程序员的需要被参数化。
针对不同的随机值类型,C++标准库提供了多种分布:线性、正态/高斯、指数、伽马、伯努利等。
1、均匀分布
(1)uniform_int_distribution : IntType
(2)uniform_real_distribution : RealType
2、伯努利分布
(1)bernoulli_distribution : bool
(2)binomial_distribution : IntType
(3)geometric_distribution : IntType
(4)negative_binomial_distribution : IntType
3、泊松分布
(1)poisson_distribution: IntType
(2)exponential_distribution: RealType
(3)gamma_distribution: RealType
(4)weibull_distribution: RealType
(5)extreme_value_distribution: RealType
4、正态分布
(1)normal_distribution: RealType
(2)lognormal_distribution: RealType
(3)chi_squared_distribution: RealType
(4)cauchy_distribution: RealType
(5)fisher_f_distribution: RealType
(6)student_t_distribution: RealType
5、抽样分布
(1)discrete_distribution: IntType
(2)piecewise_constant_distribution: RealType
(3)piecewise_linear_distribution: RealType
四、随机数生成实例
至此,我们只需要记住:
随机数 = 随机数引擎 + 分布
即可完成随机数的生成,至于选择何种引擎和分布方式,由自己决定,可查看引擎和分布的详细含义及结合自己的需要来决定。
另外,所有的引擎和分布都包含在头文件 random 中,因此需要包含此头文件。
生成随机数的三步骤:
1、选择引擎
2、选择分布
3、使用引擎+分布,生成随机数
以下是代码示例:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <random>
using namespace std;
int main() {
// 1、选择引擎:默认引擎
default_random_engine dre;
// 2、选择分布方式:均匀分布
uniform_int_distribution<int> di(10, 200);
// 3、生成随机数
for (int i = 0; i < 10; ++i) {
cout << di(dre) << " ";
}
return 0;
}
运行结果为:
133 36 107 175 85 94 44 10 181 61
将以上程序反复执行,得到的结果是相同的。所以计算机并没有真正的随机,而是由不同的“环境”来决定随机性。
调整引擎或分布或分布的初始化区间,即可产生不同的结果。
参考《C++标准库》
谢谢阅读