C++11 ランダムライブラリを使用して乱数を生成する 質問する

C++11 ランダムライブラリを使用して乱数を生成する 質問する

タイトルが示すように、私は新しい C++11 ライブラリを使用して乱数を生成する方法を見つけようとしています<random>。次のコードで試してみました:

std::default_random_engine generator;
std::uniform_real_distribution<double> uniform_distance(1, 10.001);

私が持っているコードの問題は、コンパイルして実行するたびに、常に同じ数字が生成されることです。そこで私の質問は、ランダム ライブラリ内の他のどの関数が、真にランダムでありながらこれを実現できるかということです。

私の特定のユースケースでは、閉区間内の値を取得しようとしていました。[1, 10]

ベストアンサー1

Microsoft の Stephan T. Lavavej(stl) は、Going Native で、新しい C++11 のランダム関数の使い方と、使用しないほうがよい理由について講演しましたrand()。その中で、彼は基本的にあなたの質問を解決するスライドを掲載しました。以下にそのスライドからコードをコピーしました。

彼の講演の全文は以下からご覧いただけますここ:

#include <random>
#include <iostream>

int main() {
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution<double> dist(1.0, 10.0);

    for (int i=0; i<16; ++i)
        std::cout << dist(mt) << "\n";
}

を一度使用してrandom_device、 という乱数ジェネレータをシードしますmtrandom_device()は よりも遅いですmt19937が、オペレーティングシステムからランダムデータを要求するためシードする必要はありません(ランダムデータは、次のようなさまざまな場所から取得されます)。ランドランド例えば)。


見つめているこの質問/回答uniform_real_distributionでは、 が の範囲内の数値を返すように見えます[a, b)が、 は である必要があります[a, b]。そのためには、 はuniform_real_distibution実際には次のようになります。

std::uniform_real_distribution<double> dist(1, std::nextafter(10, DBL_MAX));

おすすめ記事