gpt4 book ai didi

c++ - 播种独立位引擎,提高多精度

转载 作者:行者123 更新时间:2023-12-02 10:11:20 24 4
gpt4 key购买 nike

我有一个简单的拒绝抽样应用程序,它包含在一个类中并在外部使用,如下面的虚拟示例所示。我能够适应 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;
}

最佳答案

这有效:

#include <iostream>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <random>
#include <boost/random.hpp>

using namespace boost::multiprecision;

typedef boost::random::independent_bits_engine<boost::mt19937, std::numeric_limits<cpp_dec_float_50>::digits, cpp_int> generator;

class dummy {
public:
dummy()
{
ur_ = boost::random::uniform_real_distribution<cpp_dec_float_50>(0,1);
std::random_device rd;
gen_ = generator(rd());
ur_(gen_);
}

cpp_dec_float_50 rejectionSample() {
cpp_dec_float_50 x = ur_(gen_);
while (x > 0.1)
{
x = ur_(gen_);
}
return x;
}
private:
boost::random::uniform_real_distribution<cpp_dec_float_50> ur_;
generator gen_;
};



int main()
{
std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10) << std::showpoint;

dummy d;
int nToGet = 50;
for (int i = 0; i < nToGet; ++i) {
std::cout << d.rejectionSample() << std::endl;
}
}
所以你的误解是:
  • 您正在调用 uniform_real_distribution 的构造函数每次通话。本身没有错,但价格昂贵。
  • 您在每次调用时都使用 time(NULL) 重新播种生成器。 .这真的很糟糕;以这种方式,您甚至没有真正获得伪随机序列;您正在使用非递减时钟为生成器播种,并且仅使用出现的第一个值。
  • 您似乎对分发的工作方式的语法感到困惑,因为您对 gen() 有类似调用的语法。 .您正在将一个可调用对象传递给 uniform_real_distribution .
  • 你不应该使用 time(NULL)不再用于播种生成器;我们有 rdseed汇编指令要好得多。这就是 std::random_device 所说的.

  • 最后,不 uniform_real_distribution在内部进行拒绝抽样?那么你为什么需要这样做呢?

    关于c++ - 播种独立位引擎,提高多精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63406103/

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