均匀分布的不同位数的随机值

时间:2015-09-15 17:34:25

标签: c++ random

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

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,但不是更大。由于位数是可变的并且出于学习目的,我希望/需要手动完成。

1 个答案:

答案 0 :(得分:0)

是的,这应该在区间[0,2 ^ bit_count]中为您提供均匀分布的数字。

你得到的数字是每个位有1/2的机会为0或1.给定一些bit_count有2 ^ bit_count数字和每个数字(即单个特定的位组合)有(1/2)^ bit_count机会被生成。所以每个数字都有相同的生成机会。

然而,会有更有效的方式来表示和生成这些数字。