我需要为不同的位数生成随机变量。
我想出了以下方法来做到这一点:
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,2 ^ bit_count)的均匀分布的数字。
您得到的数字中,每个位都有1/2的机会成为0或1。给定bit_count,则有2 ^ bit_count个数字,并且每个单个数字(即位的特定组合)都有(1/2)^ bit_count个机会成为产生。因此,每个数字都有相同的机会产生。
但是,将有更有效的方法来表示和生成这些数字。
关于c++ - 不同位数的均匀分布随机值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32592299/