是否可以为boost :: random :: uniform_int_distribution <>设置确定性种子?

时间:2018-08-30 22:55:19

标签: c++ c++11 random boost boost-multiprecision

我正在使用boost::random::uniform_int_distribution<boost::multiprecision::uint256_t>来生成一些单元测试。请注意,我正在使用multiprecision,这就是为什么我需要使用boost而不是标准库的原因。对于我的定期测试,我需要从不确定性种子中生成确定性结果,但是这种方式可以在测试失败的情况下稍后重现结果。

因此,我将生成一个真实的随机数并将其用作种子,并将其注入uniform_int_distribution中。目的是,如果失败,我将使用导致测试失败的种子来重现该问题。

boost的这一部分是否支持在其界面中生成基于种子的随机数?如果没有,还有其他方法吗?

我目前生成随机数的方式是:

boost::random::random_device                                              gen;
boost::random::uniform_int_distribution<boost::multiprecision::uint256_t> dist{100, 1000};
auto random_num = dist(gen);

PS:请注意,主要要求是支持multiprecision。我需要的数字范围是16位到512位。这是为了测试,因此性能并不是真正的要求。我可以通过其他方式生成较大的随机数并将其转换为boost::multiprecision

1 个答案:

答案 0 :(得分:3)

boost::random::random_deviceNon-deterministic Uniform Random Number Generator,是一个 true 随机数生成器。除非您需要真实的不确定性随机数,否则可以使用可以植入种子的Pseudo-Random Number Generator(至少出于测试目的)。一种已知的伪随机数生成器是mersenne扭曲器boost::random::mt19937

此生成器通常由 real 随机数作为种子,您可以打印该随机数以提高单元测试的可重复性:

auto seed = boost::random::random_device{}();
std::cout << "Using seed: " << seed << '\n';
boost::random::mt19937 gen{ seed };
boost::random::uniform_int_distribution<boost::multiprecision::uint256_t> dist{100, 1000};
auto random_num = dist(gen);