【发布时间】:2020-12-03 22:45:33
【问题描述】:
我有一个简单的拒绝抽样应用程序,它被包装在一个类中并在外部使用,如下面的虚拟示例所示。我能够将 this 帖子改编为 boost::multiprecision 用例。但是我不确定如何适当地为generator 播种,也找不到任何random_device 等效项。
下面的代码“有效”,但如果你快速连续运行多次,你会得到我不想要的相同随机数。还有比time(NULL)更敏感的东西吗?
#include <iostream>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/random.hpp>
using namespace boost::multiprecision; // used only for SO post
using namespace boost::random;
typedef independent_bits_engine<boost::mt19937, std::numeric_limits<cpp_dec_float_50>::digits, cpp_int> generator;
generator &gen()
{
thread_local static generator genny(time(NULL));
return genny;
}
class dummy {
public:
dummy() = default;
cpp_dec_float_50 rejectionSample() {
uniform_real_distribution<cpp_dec_float_50> ur(0,1);
cpp_dec_float_50 x = ur(gen());
while (x > 0.1)
x = ur(gen());
return x;
}
};
int main()
{
std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10) << std::showpoint;
dummy d;
int nToGet = 5;
for (int i = 0; i < nToGet; ++i)
std::cout << d.rejectionSample() << std::endl;
}
【问题讨论】:
-
你有没有想过使用 chrono::steady_clock::now().time_since_epoch().count() 作为种子?例如。你能数毫秒吗?一般来说,我相信 chrono 的时钟比 time() 更精确。
标签: c++ random random-seed boost-multiprecision