1. ホーム
  2. c++

[解決済み] C++11のランダムライブラリを使って乱数を生成する

2022-03-05 03:52:35

質問

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

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

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

私の特別な使用例として、私は範囲内の値を取得しようとしていました。 [1, 10]

どのように解決するのですか?

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 という乱数生成器の種を蒔くために一度 mt . random_device() よりも遅いです。 mt19937 しかし、OSからランダムなデータを要求するため、シードは必要ありません(ソースは、例えば RdRand など)。


を見てみると この質問/回答 のように見えます。 uniform_real_distribution の範囲の数値を返します。 [a, b) が必要です。 [a, b] . そのために、私たちの uniform_real_distibution は、実際には次のようになるはずです。

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