15

0.0 から 1.0 の間のランダムな値を生成できるようにしたい

私は使用しようとしました

std::default_random_engine generator;
std::uniform_real_distribution<float> distribution(0.0, 1.0);

float myrand = distribution(generator);

ループでランダムな値を生成すると、常に次の値が得られます。

0.000022

0.085032

0.601353

0.891611

0.967956

0.189690

0.514976

0.398008

0.262906

0.743512

0.089548

本当にランダムな値を取得するにはどうすればよいですか? 私がいつも同じものを手に入れれば、それほどランダムではないようです。

4

3 に答える 3

21
// 1-st variant: using time() function for seed random distribution
std::default_random_engine generator(time(0));
std::uniform_real_distribution<double> distribution(first, last);
return distribution(generator);

同じ乱数ジェネレーターを使用して複数のプログラムを開くと、シードの値が同じであるため、すべて同じ結果が出力されます。

この問題は、以下のコードでランダムデバイスを使用することで解決しました。

// 2-nd variant: 
std::uniform_real_distribution<double> distribution(first, last);
std::random_device rd;
std::default_random_engine generator(rd());
return distribution(generator);
于 2013-03-17T13:24:09.400 に答える
9

プログラムの実行ごとに同じ結果が得られるという事実に言及している場合、それは、自然にランダムな値(たとえば、ユーザーが入力した数値、またはそれ以降に経過したミリ秒数)に基づいてシードを提供する必要があるためです。コンピュータの電源がオンになっている、または1970年1月1日以降など):

#include <random>

std::default_random_engine generator;
generator.seed( /* ... */ );
//              ^^^^^^^^^    
//              Provide some naturally random value here

std::uniform_real_distribution<float> distribution(0.0, 1.0);

float myrand = distribution(generator);
于 2013-03-17T13:21:23.580 に答える
1

私は別の良い解決策を見つけました...

double Generate(const double from, const double to)
{
    std::random_device rd;

    return std::bind(
        std::uniform_real_distribution<>{from, to},
        std::default_random_engine{ rd() })();
}
于 2015-05-30T15:14:38.010 に答える