购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 初始化伪随机数生成器内部状态的所有位

在上一节中,我们研究了伪随机数库及其组件,以及如何使用它生成服从不同统计分布的数字,但上一节忽略了一个重要因素,即伪随机数生成器的初始化。

通过仔细分析(这超出了本章节或本书的范围),我们发现梅森旋转引擎有重复生成某些值而忽略其他值的倾向,因此生成的数字并不服从均匀分布,而是服从二项分布或泊松分布。在本节中,你将学习如何初始化生成器,以便生成服从真实均匀分布的伪随机数。

2.4.1 准备工作

在开始之前,你应该阅读一下上一节的内容,以了解伪随机数库所提供的功能。

2.4.2 使用方式

如果想要使初始化的伪随机数生成器能够正确生成服从均匀分布的伪随机数序列,请按以下步骤执行:

1)使用std::random_device生成随机数作为种子:

2)为引擎的所有内部位生成随机数据:

3)从之前生成的伪随机数据创建std::seed_seq对象:

4)创建一个引擎对象并初始化所有表示引擎内部的状态的位(例如,mt19937内部状态有19937位):

5)根据应用程序的要求使用合适的分布:

2.4.3 工作原理

在前一节显示的所有示例中,我们使用std::mt19937引擎生成伪随机数。尽管梅森旋转引擎比其他引擎慢,但它能产生最长的非重复数字序列,且具有最好的频谱特性。但是,按照前一节的方式初始化引擎不会产生这种效果,问题在于mt19937的内部状态有624个32位整数,而在前一节的示例中,我们只初始化了其中一个整数。

使用伪随机数库时,请记住以下经验法则。

为了产生最佳结果,引擎必须在生成数字之前正确初始化其所有内部状态。

为此,伪随机数库提供了一个名为std::seed_seq类,这是一个生成器,它可以将任意32位的整数作为种子,并生成呈均匀分布的32位的整数。

在前面2.4.2节的代码中,我们定义了一个名为seed_data的数组,其中包含一些32位的整数,这就是mt19937生成器的内部状态,整数数量等于624。然后,我们用std::random_device生成的随机数初始化数组,该数组后来被用作std::seed_seq的种子,而后者又作为mt19937的种子。

2.4.4 延伸阅读

❍ 阅读2.3节,以熟悉标准数值库生成伪随机数的功能。 rZ9hORKCrf/jLp0NNxdPVDuVw69cPPDNnjc9dKn7KmzOtb/CBQ9FRSZ5AZ5LYDGj

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开