gpt4 book ai didi

c++ - 如何从 C++ 获得一致的行为

转载 作者:太空狗 更新时间:2023-10-29 20:01:39 26 4
gpt4 key购买 nike

我遇到了一个问题,如果我从 C++ <random> 重新播种随机数生成器库,我有时从序列中获取即将到来的值作为第一个样本。在第一个样本之后,我得到了一个可重复的序列。它似乎有一种模式,但我不太明白它是什么。

最小的例子:

#include <iostream>
#include <random>

using namespace std;
int main(){
mt19937 engine {1};
normal_distribution<float> nd {0, 1};
for (int i=0; i<10; i++){
for (int j=0; j<=i; j++) {
cout << nd(engine) << endl;
}
cout << endl;
engine.seed(1);
}
return 0;
}

使用 g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 编译,在 WSL Ubuntu 18.04.2 上没有任何标志。

我得到以下输出:

0.3064

0.156066
0.3064

0.156066
0.3064
0.156066

0.3064
0.156066
-0.424386
-0.56804

0.3064
0.156066
-0.424386
-0.56804
-0.204547

-0.806289
0.3064
0.156066
-0.424386
-0.56804
-0.204547

-0.806289
0.3064
0.156066
-0.424386
-0.56804
-0.204547
-0.806289

0.3064
0.156066
-0.424386
-0.56804
-0.204547
-0.806289
-0.428738
-1.20004

0.3064
0.156066
-0.424386
-0.56804
-0.204547
-0.806289
-0.428738
-1.20004
1.30547

-1.18775
0.3064
0.156066
-0.424386
-0.56804
-0.204547
-0.806289
-0.428738
-1.20004
1.30547

我希望 0.3064 始终是我获得的第一个值。我可以通过在重新播种后烧掉一个样本来解决这个问题,但我没有看到何时需要这样做的明确模式。有谁知道我为什么会出现这种行为?是否有我应该使用的编译器标志?

最佳答案

您忘记重置分发状态。为引擎播种后调用 nd.reset();

修复后的原始代码:

#include <iostream>
#include <random>

using namespace std;
int main(){
mt19937 engine {1};
normal_distribution<float> nd {0, 1};
for (int i=0; i<10; i++){
for (int j=0; j<=i; j++) {
cout << nd(engine) << endl;
}
cout << endl;
engine.seed(1);
nd.reset();
}
return 0;
}

Live example with output

关于c++ - 如何从 C++ <random> 获得一致的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55777705/

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