如何使用 boost 生成不同位的随机多精度整数?

Posted

技术标签:

【中文标题】如何使用 boost 生成不同位的随机多精度整数?【英文标题】:How can I generate random multiprecision ints of different bits using boost? 【发布时间】:2020-08-19 01:18:21 【问题描述】:

我需要生成大量各种位的随机多精度整数(boost mpx_int)。我目前的方法是基于这两个例子:boost multiprecision random,constexpr array。要以这种方式生成随机数,我需要将位数作为 constexpr。我可以生成一个 constexpr int 数组,但后来我卡住了,因为我无法从 for 循环中访问它们。

代码示例:

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

using namespace std;
using namespace boost::multiprecision;
using namespace boost::random;

template <int bit_limit>
struct N_bit_nums

    constexpr N_bit_nums() : bits
    
        for (int i = 0; i < bit_limit; ++i)
        
            bits[i] = i + 1;
        
    

    int bits[bit_limit];
;

int main()

    constexpr int bit_limit = 3; // this will actually be on the order of 10^6
    constexpr N_bit_nums<bit_limit> n_bit_nums;

    for (int i = 0; i < bit_limit; ++i)
    
        independent_bits_engine<mt19937, n_bit_nums.bits[i], cpp_int> generator; // error: the value of ‘i’ is not usable in a constant expression
        cpp_int rand_num = generator();
        cout << rand_num << "\n"; // just to see what is going on while testing
    

    return 0;

【问题讨论】:

你为什么要经历模板化的麻烦。只是让它先工作。请记住,每个 bit_limit 都会有一个模板化代码版本。你真的想要一百万份你的代码吗? 使用模板是我发现的一种基于 ***.com/questions/19019252/… 创建 constexpr int 数组的方法。我在这里学习如何以任何方式解决这个问题,不一定是我目前正在尝试的方法。 为什么需要位数作为 constexpr? boost::random::independent_bits_engine 需要它 来自 boost 文档的示例:boost.org/doc/libs/1_73_0/libs/multiprecision/doc/html/… 【参考方案1】:

我能够通过将 Independent_bits_engine 固定为所需的最大位数,然后屏蔽所需的位数来实现这一点。

例子:

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

using namespace std;
using namespace boost::multiprecision;
using namespace boost::random;

int main()

    constexpr int bit_limit = 100;
    independent_bits_engine<mt19937, bit_limit, cpp_int> generator;

    // prints random numbers of bit sizes from 1 to bit_limit
    for (int n = 1; n <= bit_limit; n++)
    
        cpp_int rand_num = generator();              // next random value
        cpp_int n_bit_mask = pow(cpp_int2, n) - 1; // n bits mask
        cpp_int n_bit_num = rand_num & n_bit_mask;   // take n lsb
        cout << n_bit_num << "\n";                   // print the n bit random number
    

    return 0;

【讨论】:

以上是关于如何使用 boost 生成不同位的随机多精度整数?的主要内容,如果未能解决你的问题,请参考以下文章

如何以二进制形式显示 C++ Boost Library 多精度大整数?

随机浮点数生成

具有固定种子和可变精度的 boost::multiprecision 随机数

Boost 的多精度模拟低精度快速浮点数

使用 boost::spirit 解析任意精度整数

在 C++ 中生成随机双精度数