gpt4 book ai didi

c++ - 使用 boost::random 跨平台生成一致的随机数

转载 作者:太空狗 更新时间:2023-10-29 23:03:12 30 4
gpt4 key购买 nike

我们在项目中使用 boost::random 已有一段时间了。最近,一个失败的测试单元让我对它的一个特性很感兴趣:不同版本的 Boost 生成的数字序列可能不同,这取决于使用的分布。

这种行为在所有发行版中似乎并不一致。大多数情况下,使用具有相同种子的 RNG 进行均匀分布会产生相同的结果。 normallognormalbinomialdiscrete 等其他分布可能会显示这些差异。

我整理了一个简单的 C++ 程序来说明问题:

#include <iostream>
#include <boost/random.hpp>
#include <stdint.h>

void uniform() {
uint32_t seed = 42;
boost::mt19937 rng(seed);
boost::random::uniform_real_distribution<double> distro(0., 1.);
std::cout << "uniform" << std::endl;
for (int i=0; i<10; ++i) {
std::cout << distro(rng) << std::endl;
}
}

void normal() {
uint32_t seed = 42;
boost::mt19937 rng(seed);
boost::random::normal_distribution<double> distro(0., 1.);
std::cout << "normal" << std::endl;
for (int i=0; i<10; ++i) {
std::cout << distro(rng) << std::endl;
}
}

void discrete() {
uint32_t seed = 42;
boost::mt19937 rng(seed);
std::vector<double> P;
P.push_back(0.3);
P.push_back(0.4);
P.push_back(0.3);
boost::random::discrete_distribution<uint64_t> distro(P.begin(), P.end());
std::cout << "discrete" << std::endl;
for (int i=0; i<10; ++i) {
std::cout << distro(rng) << std::endl;
}
}

int main() {
uniform();
normal();
discrete();
}

这个简单的程序将为 Boost 1.56(在 OSX 上运行)显示不同的数字序列:

uniform
0.37454
0.796543
0.950714
0.183435
0.731994
0.779691
0.598658
0.59685
0.156019
0.445833
normal
-0.638714
-0.836808
-0.400566
-0.869232
-0.972045
-0.758932
-1.30435
1.22996
0.249399
0.286848
discrete
1
2
2
1
0
0
0
2
1
2

或使用 Boost 1.50(在 Ubuntu 12.10 上运行):

uniform
0.37454
0.796543
0.950714
0.183435
0.731994
0.779691
0.598658
0.59685
0.156019
0.445833
normal
-1.25821
1.2655
0.606347
-0.19401
-0.196366
-1.72826
-1.09713
-0.783069
0.604964
0.90255
discrete
2
1
2
1
1
0
1
1
0
1

请注意,均匀分布按预期工作:即,相同的种子在两个版本上生成一致的数字序列。正态分布和离散分布的行为不同。

有没有办法“解决”这个问题? IE。不同的平台是否独立于 boost 版本生成完全相同的序列?

最佳答案

似乎 boost::random 并不能保证您对具有不同版本 boost 的某些种子获得相同的数字序列。

例如在 1.56 版中,他们更改了算法以从 Box-Muller 生成正态分布的随机数。 Ziggurat 的方法方法:

https://github.com/boostorg/random/commit/f0ec97ba36c05ef00f2d29dcf66094e3f4abdcde

这种方法速度更快,但也会产生不同的数字序列。

其他发行版可能也进行了类似的更改。均匀分布仍然产生与基本 rng 的典型输出相同的结果,默认情况下是 mersenne twister 19937。

关于c++ - 使用 boost::random 跨平台生成一致的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26506550/

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