gpt4 book ai didi

random - boost::multiprecision 随机数与固定种子和可变精度

转载 作者:行者123 更新时间:2023-12-04 09:05:17 33 4
gpt4 key购买 nike

在 rng 中使用固定种子时,如果精度变化,结果将无法重现。即,如果更改模板参数 cpp_dec_float<xxx>并运行以下代码,会看到不同的输出(对于精度的每次变化)。

#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;
}
我猜似乎有道理。但我如何做到这一点 n位数的精度,固定种子将产生一个数字 x相当于 yn数字其中 y定义为 n+1数字?例如
x = 0.213099234     // n = 9
y = 0.2130992347 // n = 10
...

最佳答案

要添加到出色的@user14717 答案中,要获得可重现的结果,您必须:

  • 使用宽(比输出尾数+1 宽)随机位生成器。可以说,您需要不超过 128 位尾数的 MP 加倍,然后使用产生 128 位输出的位生成器。在内部,它可能是一些标准的 RNG,如 mersenne twiner 将单词链接在一起以达到所需的宽度。
  • 您拥有uniform_real_distribution,它将这128位转换为尾数
  • 最后,丢弃 128 位包中的其余位。

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

    关于random - boost::multiprecision 随机数与固定种子和可变精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63461658/

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