使用C++ 生成随机数:STL中的随机数引擎+分布

一、基本信息

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++标准库》

谢谢阅读

猜你喜欢

转载自blog.csdn.net/weixin_43869898/article/details/114182656