我需要为不同的位数生成随机变量。
我想出了以下方法来做到这一点:

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/

10-13 07:01