2015-09-15 113 views
1

我需要爲不同的位數生成隨機變量。 我想出了以下的方法來做到這一點:不同位數的隨機值均勻分佈

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)的統一分佈的數字。

你正在得到數字,其中每一位有一半的機會是0或1.給定一些bit_count有2^bit_count數字,每一個數字(即單個特定的位組合)有(1/2)^ bit_count機會被生成。所以每個數字都有相同的機會來生成。

但是會有更有效的方式來表示和生成這些數字。