随机数生成 —— random
c++11 后,c++ 标准提供了与随机数生成相关的标准库来取代之前 c 语言中提供的 random(), rand() 等伪随机函数的功能。可在源文件中通过头文件 random 使用其提供的一些列随机相关的类和函数的功能。
#include<random> //包含头文件 random
c++ 提供的随机数生成库包含有两个主要组成部分,随机数生成引擎类和随机数分布类。不同的随机数生成引擎类主要根据不同的随机数生成算法生成随机数,而随机数分布类则可根据随机数生成引擎生成的随机数转换为对应数据分布的输出,比如将生成的随机数转换为符合某种正态分布的输出。
c++ 标准库提供的是随机数生成引擎的类模板,需进行对应的实例化。这里主要以练习中用到的随机数生成引擎类 default_random_engine 的使用来举例。标准库中定义了很多预定义的随机数生成器( 为生成器类,根据标准库提供的随机数生成器模实例化得到的),可以见这里,其中一个随机数生成器会被指定为 default_random_engine,其使用方法也比较普适。
/*-定义随机数引擎对象-*/ std::default_random_engine e; //默认初始化随机数引擎状态,注意对命名空间的声明 std::default_random_engine e(s); //整形初始化随机数引擎状态 std::default_random_engine e(n); //使用同类型的随机数引擎 n 初始化
随机数生成引擎调用时返回值为一个无符号整形,常用的对随机数引擎的操作如下。
e.max() //该引擎可生成的最大值 e.min() //该引擎可生成的最小值 e() //对 () 重载的调用,不接受参数,e 更新状态,返回生成的随机数
随机数生成引擎生成的随机数一般范围不确定,难以满足某些需要确定范围随机数的需求。标准库另外提供了一系列的随机数分布,可对随机数生成引擎生成的随机数进行转换,从而产生对应的符合特定范围和分布的随机数,从而满足特定应用的需求。
这里主要以生成浮点数均匀分布的 uniform_real_distribution 为例,介绍下随机数分布的使用。
/*-定义随机分布对象-*/ std::uniform_real_distribution<> u; //默认初始化,使用默认模板实参,为 double 类型 std::uniform_real_distribution<double> u; //默认初始化,生成范围为[ 0.0, 1.0 ) std::uniform_real_distribution<double> u( a, b ); //double 型的均匀分布类,其生成数的值域为[ a, b )
使用随机数分布的方法如下。
u(e) //调用 () 重载,以某个随机数生成引擎(的引用)作为参数,返回位于对应分布内的随机数 u.max() //分布范围的最大值 u.min() //分布范围的最小值
注意,一个给定的随机数分布生成的随机数序列总是相同的,随意想要保证生成的随机性,应该保证随机数生成器总是存在( 状态总是向后更新 )而不是重新开始( 从一个相同的起始状态生成相同的随机数序列 ),或者总是使用不同的种子值来初始化随机数生成器的状态。
参考来源:
Pseudo-random number generation - cppreference
17.4 随机数 - c++ primer
复数类 —— complex
通过头文件 complex 使用 c++ 提供的复数库。
#include<complex> //包含头文件 complex using std::complex; //注意声明 complex 位于命名空间 std 中
c++ 提供了关于复数的类模板 complex,其使用两个类型相同的变量如 a 和 b 分别表示复数的实部和虚部,即表示复数 a + bi.可通过 float、double 和 long double 来实例化 complex 类模板从而获得使用对应的数据类型表示复数的 complex 类。可通过 typedef 定义来简化对复数类的使用。
typedef complex<float> f_complex; //f_complex 为实/虚部均为 float 类型的复数类 typedef complex<double> d_complex; //d_complex 为实/虚部均为 double 类型的复数类 typedef complex<long double> ld_complex; //ld_complex 为实/虚部均为 long double 类型的复数类
常用的构造函数
f_complex a; //默认初始化,实部和虚部被设置为 0.0 f_complex a( 1.0, 2.0 ); //使用 1.0 初始化实部,使用 2.0 初始化虚部 f_complex a( b ); //拷贝初始化,使用一个同为 f_complex 的复数对象 b 初始化复数对象 a
部分所支持的函数
//成员函数 real //返回实部 img //返回虚部 //非成员函数 operator*/+/- //复数加减运算重载 abs( x ) //返回复数的模 exp( x ) //计算以 e 为底,参数 x 为幂的结果 pow( x , y ) //计算 x^y
std::complex - zh.cppreference.com
C++ 练习中使用的库和简单工具 —— rondom 和 complex
原文:https://www.cnblogs.com/yhjoker/p/12519980.html