第17.4.1节的标题是“发动机产生一个数字序列”。
给定的随机数发生器总是产生相同的数字序列.带有本地随机数生成器的函数应该使该生成器(引擎和分布对象)保持静态。否则,该函数将在每个调用中生成相同的序列。
“给定的随机数发生器总是产生相同的数字序列.”它指的是哪种给定的生成器?
如果给出一个随机数引擎和一个随机数分布,它们构成一个给定的随机数发生器。
因此,我在不同的编译器上编译并运行了以下代码。
#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为什么会发生这种情况?
发布于 2022-03-23 17:15:02
在C++11中引入的随机数工具有两类:生成器和分布。发生器是伪随机数的来源.分布以生成器的结果作为输入,并产生满足该分布的统计要求的值。
生成器是严格指定的:它们必须使用具有特定内部值集的特定算法。事实上,C++标准中的规范包括每个默认构造的生成器将产生的第10,000个值。因此,它们在所有平台上都会有相同的行为。
分发没有严格指定;它们的行为是根据它们提供的总体分布来描述的;它们不需要使用任何特定的算法。使用它们的代码在所有平台上都是可移植的;它们从同一个生成器产生的值不一定相同。
新构造的生成器对象将产生由其算法指定的特定值序列。另一个新构造的生成器对象将产生完全相同的序列。因此,通常,您希望创建一个生成器对象和一个分发对象,并使用该对象生成所需的伪随机序列。
https://stackoverflow.com/questions/71589042
复制相似问题