1

1 から n の間の乱数を生成する必要があります。n は unsigned int です。n が int の場合、単純に と記述し1 + rand()% nます。残念ながら n は unsigned int です。何を指示してるんですか?

4

1 に答える 1

11

rand() は、可能な限り避ける必要があります*。http://en.cppreference.com/w/cpp/numeric/randomを使用

#include <random>
#include <iostream>


int main()
{
    std::random_device rd;
    std::mt19937 engine(rd());
    std::uniform_int_distribution<unsigned> dist(1, 77);

    for (int i = 0; i != 5; ++i)
        std::cout << dist(engine) << '\n';
}

* グローバルな状態を共有するため、多くの場合、線形合同エンジンとして実装されますが、これにはいくつかの欠点があり、範囲は 0 ~ 2^16 しかありません。また、n が範囲の正確な倍数ではない % n は、均一な分布を生成しません

編集: これはやり過ぎのように思えるかもしれませんが、mt19937 には少し「ウォームアップ」が必要なので、技術的には次のようなものが必要です。

std::mt19937 create_seeded_rng() 
{ 
    std::random_device rd; 
    std::array<std::mt19937::result_type, std::mt19937::state_size> seed_data; 
    std::generate(seed_data.begin(), seed_data.end(), std::ref(rd)); 
    std::seed_seq seq(seed_data.begin(), seed_data.end()); 
    return std::mt19937(seq); 
} 

int main() 
{ 
    std::mt19937 rng = create_seeded_rng(); 
    std::uniform_int_distribution<int> dist(0, 100); 

    for (unsigned i = 0; i != 100; ++i) 
        std::cout << dist(rng) << '\n'; 
}
于 2013-09-07T18:15:05.483 に答える