如何解决如何使用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;
}
解决方法
我能够通过将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_int{2},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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。