我需要为不同的位数生成随机变量。 我想出了以下方法:
constexpr const std::size_t bit_count = 77U;
std::uint_fast32_t seed = 0U;
try
{
std::random_device rd;
seed = rd(); // may throw
}
catch(std::exception& e)
{
//simply use time as seed then
seed = std::chrono::system_clock::now().time_since_epoch().count();
}
std::mt19937 mt(seed);
using number_t = std::vector<bool>;
std::vector<number_t> numbers;
for(std::size_t h = 0U; i < how_many_numbers; ++h)
{
std::uniform_int_distribution<int> dist(0, 1);
numbers.push_back(number_t());
auto& num = numbers.back();
num.resize(bit_count);
for(std::size_t i = 0U; i < bit_count; ++i)
num[i] = (dist(mt) == 0);
}
这是否会均匀分布并且几乎与直接生成的一样?
如果没有:你怎么能这样做?我真的需要那些不同的位大小用于散列目的,所以只使用一些原始类型不是那种类型的选项,特别是因为位数可能是8192,但不是更大。由于位数是可变的并且出于学习目的,我希望/需要手动完成。
答案 0 :(得分:0)
是的,这应该在区间[0,2 ^ bit_count]中为您提供均匀分布的数字。
你得到的数字是每个位有1/2的机会为0或1.给定一些bit_count有2 ^ bit_count数字和每个数字(即单个特定的位组合)有(1/2)^ bit_count机会被生成。所以每个数字都有相同的生成机会。
然而,会有更有效的方式来表示和生成这些数字。