2016-05-01 8 views
1

現在、実行時に乱数を生成することに固執しています。 Javaでは、私はMath.random()を呼び出すだけで、かなり手間がかかります(単純なRNGが必要です)。 C++では、乱数を生成するいくつかの方法を試してきましたが、常に同じ結果に終わります。C++の乱数は常に同じです

現在、私は、MINとMAXの間の乱数を取得するには、以下の方法を使用しています:

unsigned int getRandomNumber(int min, int max){ 
    std::mt19937 mt(1729); 
    std::uniform_int_distribution<int> dist(min, max); 
    return dist(mt); 
} 

私はそのコンストラクタでこの関数を呼び出し、属性に戻り値を代入するオブジェクトを持っています。私は現在、このオブジェクトの5つのインスタンスを作成し、乱数は常に同じです。大きな範囲(1〜1000)を設定してもこれは変わりません。番号は常に同じです。セキュリティは問題ではなく、非常に単純なアプリケーションです。 mt静的を作る

+2

あなたは乱数ジェネレータに毎回同じシード値を与えています。プログラムの中で一度だけそれに。 –

+0

リンクありがとう! – NL3

答えて

7

乱数ジェネレータはseedで動作します。基本的には乱数ジェネレータが動作するために一度だけ設定される数値です。番号を生成しようとするたびに乱数ジェネレータを再配置すると、毎回同じ番号が返されます。 std::mt19937オブジェクトは1回だけ作成する必要があります。

2
unsigned int getRandomNumber(int min, int max){ 
    static std::mt19937 mt(1729); 
    std::uniform_int_distribution<int> dist(min, max); 
    return dist(mt); 
} 

はそれだけで、それは一度だけに播種されることを意味する、それは一度だけ構築されることを意味する、一度インスタンス化されることになります。この修正プログラムを使用しても、プログラムを実行するたびに同じ一連の数値が得られますが、1回の実行でgetRandomNumberを呼び出すたびに異なる数字が表示されます。

他の場所で変数mtをインスタンス化し、この関数にパラメータとして渡して、コンストラクタ呼び出し以外のコードでどのようにシードされるかを管理することができます。通常、時間に基づいて値を設定します。多くの洞察here

関連する問題