Random 具有固定种子和可变精度的多精度随机数

Random 具有固定种子和可变精度的多精度随机数,random,boost-multiprecision,Random,Boost Multiprecision,在rng内使用固定种子时,当精度发生变化时,结果不可重复。也就是说,如果更改模板参数cpp_dec_float并运行以下代码,则会看到不同的输出(对于精度的每次更改) 这些分布的工作方式是将随机位移到浮点数的尾数中。如果更改精度,每次调用都会消耗更多的这些位,因此会得到不同的随机序列 如果不编写自己的uniform\u real\u发行版,我认为您无法实现目标。您可能需要两个整数RNG,一个填充最高有效位,另一个填充最低有效位。要添加到优秀的@user14717答案中,以获得可再现的结果,您必须

在rng内使用固定种子时,当精度发生变化时,结果不可重复。也就是说,如果更改模板参数cpp_dec_float并运行以下代码,则会看到不同的输出(对于精度的每次更改)


这些分布的工作方式是将随机位移到浮点数的尾数中。如果更改精度,每次调用都会消耗更多的这些位,因此会得到不同的随机序列


如果不编写自己的
uniform\u real\u发行版
,我认为您无法实现目标。您可能需要两个整数RNG,一个填充最高有效位,另一个填充最低有效位。

要添加到优秀的@user14717答案中,以获得可再现的结果,您必须:

  • 使用宽(比输出尾数+1宽)随机位生成器。比方说,您需要不超过128位尾数的MP Double,然后使用产生128位输出的位生成器。在内部,它可以是一些标准的RNG,比如mersenne twister,将单词链接在一起以达到所需的宽度

  • 您拥有统一的实分布,它将128位转换为尾数

  • 最后,丢弃128位包中的剩余位

  • 使用这种方法将保证获得相同的实际输出,唯一的区别在于精度

    #include <iostream>
    #include <boost/multiprecision/cpp_dec_float.hpp>
    #include <boost/multiprecision/cpp_int.hpp>
    #include <random>
    #include <boost/random.hpp>
        
    typedef boost::multiprecision::cpp_dec_float<350> mp_backend; // <--- change me
    typedef boost::multiprecision::number<mp_backend, boost::multiprecision::et_off> big_float; 
    typedef boost::random::independent_bits_engine<boost::mt19937, std::numeric_limits<big_float>::digits, boost::multiprecision::cpp_int> generator;
    
    
    int main()
    {
        std::cout << std::setprecision(std::numeric_limits<big_float>::digits10) << std::showpoint;
        auto ur = boost::random::uniform_real_distribution<big_float>(big_float(0), big_float(1));
        generator gen = generator(42); // fixed seed
        std::cout << ur(gen) << std::endl;
        return 0;
    }
    
    x = 0.213099234     // n = 9
    y = 0.2130992347    // n = 10
    ...