gpt4 book ai didi

c++ - 如何理解 C++ primer 5 中的 "a given random-number generator always produces the same sequence of numbers"?

转载 作者:行者123 更新时间:2023-12-05 05:44:33 26 4
gpt4 key购买 nike

第 17.4.1 节中的标题“引擎生成数字序列”有以下警告。

A given random-number generator always produces the same sequence of numbers. A function with a local random-number generator should make that generator (both the engine and distribution objects) static. Otherwise, the function will generate the identical sequence on each call.

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

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

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

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

#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;
}

}

为了便于观看,我不会发布所有结果。

//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

为什么会这样?

最佳答案

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

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

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

一个新构造的生成器对象将产生一个由其算法指定的特定值序列。另一个新构造的生成器对象将产生完全相同的序列。因此,一般来说,您想要创建一个生成器对象和一个分布对象,并使用这对对象来生成您想要的伪随机序列。

关于c++ - 如何理解 C++ primer 5 中的 "a given random-number generator always produces the same sequence of numbers"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71589042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com