我正在使用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
。
答案 0 :(得分:3)
boost::random::random_device
是Non-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);