10

指定された範囲で均一に分散された疑似乱数を取得する関数はありますか? を使用して独自の関数を作成することもできますrandが、これは十分に一般的な状況のようで、おそらく STL に何かが含まれているようです。

4

3 に答える 3

16

Boostは、乱数生成のための多くのツールを提供します。均一な分布の場合、次のものがあります。

http://www.boost.org/doc/libs/1_49_0/doc/html/boost/random/uniform_real_distribution.html

編集:新しい C++11 実装を含むように更新されました。整数の場合、ここに参照があります:

http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution

簡単な例は次のとおりです。

#include <random>
#include <iostream>
int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 6);
    for(int n=0; n<10; ++n)
        std::cout << dis(gen) << ' ';
    std::cout << '\n';
}
于 2012-05-22T22:07:59.950 に答える
10

C++ で疑似乱数を生成するには、ヘッダーからMersenne twister疑似乱数ジェネレーター エンジンを使用するのが非常に良いオプションです。std::mt19937<random>

このエンジンは、高品質のランダム ビットを吐き出すブラック ボックスと考えることができます。

次に、これらのランダムなビットは、分布を使用していくつかの整数出力に整形できます。特に、均一に分散された疑似乱数を取得するには、aを使用できます。std::uniform_int_distribution

エンジン オブジェクトはシードで初期化する必要があることに注意してください。
std::random_deviceその目的のために使用することができます。

したがって、このプロセスは次の 3 つの論理的なステップに要約できます。

  1. のインスタンスを作成して、メルセンヌ ツイスター エンジンの非決定論的シードstd::random_deviceを取得します。
  2. 高品質の疑似乱数ビットを取得するために、 std::mt19937 engineのインスタンスを作成します。
  3. std::uniform_int_distributionaを使用して、これらのランダム ビットを均一に分布した整数に整形します。

コンパイル可能な C++ コードは次のとおりです。

#include <iostream>     // for console output
#include <random>       // for pseudo-random number generators and distributions

int main()
{
    // Use random_device to generate a seed for Mersenne twister engine.
    std::random_device rd;    

    // Use Mersenne twister engine to generate pseudo-random numbers.
    std::mt19937 engine(rd());
    
    // "Filter" MT engine's output to generate pseudo-random integer values,
    // **uniformly distributed** on the closed interval [0, 99].  
    // (Note that the range is [inclusive, inclusive].)
    std::uniform_int_distribution<int> dist(0, 99);

    // Generate and print 10 pseudo-random integers
    for (int i = 0; i < 10; ++i)
    {
        std::cout << dist(engine) << ' ';
    }
    std::cout << std::endl;
}

C++ での疑似乱数の生成の詳細 (良くないrand()理由を含む) については、 Stephan T. Lavavejによるこのビデオ( Going Native 2013から) を参照してください。

rand()有害とみなされる

于 2014-02-25T17:47:29.240 に答える