C++ Primer 随机数

C++ Primer 随机数,第1张

C++ Primer 随机数

文章目录

引入随机数引擎分布

引擎对象分布对象 其他随机数分布

引入

rand是早期用于生成随机数的函数,此函数生成均匀分布的伪随机整数。每个随机数的范围在0和一个系统相关的最大值之间。

伪随机指的是由算法生成的随机数,看似随机的表面下可能暗含规律。

rand函数存在问题:很多程序需要不同范围的随机数或者随机浮点数或者非均匀分布的随机数。在构造这些要求的同时会引入非随机性。

定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类和随机数分布类。

引擎类可以生成unsigned随机数序列;

分布类使用一个引擎类生成指定类型的、在给定范围内的、服从特点概率分布的随机数。

随机数引擎和分布 引擎对象

随机数引擎是函数对象类,定义了一个调用运算符(类本身也是具有特别的功能)。该运算符不接受参数并返回一个随机unsigned整数。我们可以通过调用一个随机数引擎对象来生成原始随机数:

default_random_engine e; //生成随机无符号数
for(size_t i = 0; i<10; ++i)
	// e()调用对象来生成下一个随机数
	cout << e() << " ";

标准库定义了多个随机数引擎类,区别在于性能和随机性质量不同。每个编译器都会指定其中一个作为default_random_engine类型。

随机数引擎 *** 作含义Engine e;默认构造函数;使用该引擎类型默认的种子Engine e(s);使用整型值s作为种子e.seed(s);使用种子s重置引擎的状态e.min();此引擎可生成的最小值e.max();此引擎可生成的最大值Engine::result_type;此引擎生成的unsigned整型类型e.discard(u);将引擎推荐u步;u的类型为unsigned long long 分布对象
// 生成0到9之间(包含)均匀分布的随机数
uniform_int_distribution u(0,9);
default_random_engine e;
for (size_t i=0; i<10; ++i)
	// 将u作为随机数源
	// 每个调用返回在指定范围内并服从均匀分布的值
	cout << u(e) << "";

uniform_int_distribution含义是均匀分布的unsigned值。

需要注意的是我们传递给分布对象的是引擎本身,即u(e)。

当我们说随机数发生器时,指的是分布对象和引擎对象的组合。

随机数引擎和rand函数的区别在于前者生成的数的范围在一个系统定义的范围内而后者在0到RAND_MAX之间。

随机数发生器在每次运行程序时(同一个程序),他都会返回相同的数值序列。

随机数发生器可以看做已经生成了很长的序列,如果我们调用了十次随机数发生器,会输出序列的前10个数。

如果我们将随机数发生器封装到一个函数里面,那么每次调用这个函数生成的随机数会是相同的,这是因为状态清零,从头开始,可以通过在引擎对象和分布对象之前加上static来迫使状态保持。

通过设置随机数种子,可以让引擎从序列中的一个新位置重新开始生成随机数。

可以通过time函数来生成种子。这个函数定义在头文件ctime中,返回从一个特定时刻到当前时刻经过了多少秒。函数time接受单个指针参数,它指向用于写入时间的数据结构。如果此指针为空则简单地返回时间。这种方法只适合于生成种子的间隔为秒级或者更长的应用。

其他随机数分布 分布对象含义uniform_real_distribution u(0,1)0到1(包含)的均匀分布normal_distribution<> n(4,1.5)均值为4,标准差为1.5的正态分布bernoulli_distribution b默认p=0.5的伯努利分布

说明:

    分布类型都是模板,具有单一的模板类型参数,表示分布生成的随机数的类型;每个分布模板都有一个默认模板实参。生成浮点值的分布类型默认生成double值;由于分布类型只有一个模板参数,因此党我们希望使用默认随机数类型时要记得在模板名之后使用空尖括号;

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5711735.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存