1

さまざまなアルゴリズムを保持する RNG クラスを作成しましたが、期待どおりに動作しません。(一様ではなく) 通常の分布を使用したいという事実に加えて、私のコードは常に同じ数値 (最大) または間隔 [最小、最大] から 2 つの数値のみを返します。

std::function<int(int, int)> mt19937 =
    [](int min, int max) -> int {
        std::uniform_int_distribution<int> distribution(min, max);
        std::mt19937 engine;
        engine.seed(time(null));
        auto generator = std::bind(distribution, engine);
        return generator();
    };

このパズルを解くために何が欠けているのか、誰か説明してもらえますか? さらに、どうすれば正規分布を実装できますか? 前回試したときstd::normal_distributionは、境界に入ることができませんでした!

編集: 正規分布について話すとき、2 つの境界付近の RNG の結果は、両方の平均ほど頻繁に生成されるべきではないことを意味します。たとえば、標準ガウス分布のグラフ表示を見てください。理解できれば、この方法で実装/使用したい結果の値の確率を視覚化するため、参照しています。

4

1 に答える 1

1

正規分布はまさにこれです(xは一様乱数です):

普通

しかし、問題になる可能性のあるものがあります。

std::uniform_int_distribution<int> distribution(min, max);

これはあなたのナンバジェネレータにint型を与えていませんか?


シードの問題を解決するには、エンジンをラムダの外に作成し、作成時にシードします。

RNG は、ランダムに見える数字を生成するアルゴリズムを使用しますが、繰り返しの周期が非常に長くなります (メルセンヌ ツイスターのハイライト)。シードするときは、プロセスを開始するための初期値を RNG に与えます。別の番号を要求するたびに、アルゴリズムの別の反復が吐き出されます。

すべての反復をシードする場合:

time(NULL)

このコードは 1 秒ごとにしか変化しないため、新しい乱数を要求すると、1 秒ごとにしか変化しません。

于 2011-10-01T21:45:23.197 に答える