首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解C++引物5中“给定的随机数生成器总是产生相同的数字序列”?

如何理解C++引物5中“给定的随机数生成器总是产生相同的数字序列”?
EN

Stack Overflow用户
提问于 2022-03-23 14:33:41
回答 1查看 123关注 0票数 3

第17.4.1节的标题是“发动机产生一个数字序列”。

给定的随机数发生器总是产生相同的数字序列.带有本地随机数生成器的函数应该使该生成器(引擎和分布对象)保持静态。否则,该函数将在每个调用中生成相同的序列。

“给定的随机数发生器总是产生相同的数字序列.”它指的是哪种给定的生成器?

如果给出一个随机数引擎和一个随机数分布,它们构成一个给定的随机数发生器。

  1. 总是会产生一个给定种子的固定值序列吗?
  2. 不会因为不同的编译器或系统环境而改变吗?

因此,我在不同的编译器上编译并运行了以下代码。

代码语言:javascript
复制
#include <iostream>
#include <random>
using namespace std;

minstd_rand0 dre1(13232);
minstd_rand0 dre2(13232);

int main()
{
    uniform_int_distribution<unsigned> h1(0,10);
    uniform_int_distribution<unsigned> h2(0,10);
    unsigned t=100;
    while(t--){
        cout << "dre1:" << h1(dre1) << endl;
        cout << "dre2:" << h2(dre2) << endl;
    }

}

因为它很容易观察,我不会公布所有的结果。

代码语言:javascript
复制
//in gcc and clang:
dre1:1 
dre2:1 
dre1:5 
dre2:5 
dre1:1 
dre2:1 
dre1:9 
dre2:9 
dre1:6 
dre2:6
//in msvc
dre1:0
dre2:0
dre1:0
dre2:0
dre1:3
dre2:3
dre1:2
dre2:2
dre1:0
dre2:0

为什么会发生这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-23 17:15:02

在C++11中引入的随机数工具有两类:生成器和分布。发生器是伪随机数的来源.分布以生成器的结果作为输入,并产生满足该分布的统计要求的值。

生成器是严格指定的:它们必须使用具有特定内部值集的特定算法。事实上,C++标准中的规范包括每个默认构造的生成器将产生的第10,000个值。因此,它们在所有平台上都会有相同的行为。

分发没有严格指定;它们的行为是根据它们提供的总体分布来描述的;它们不需要使用任何特定的算法。使用它们的代码在所有平台上都是可移植的;它们从同一个生成器产生的值不一定相同。

新构造的生成器对象将产生由其算法指定的特定值序列。另一个新构造的生成器对象将产生完全相同的序列。因此,通常,您希望创建一个生成器对象和一个分发对象,并使用该对象生成所需的伪随机序列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71589042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档