2017-06-13 5 views
-3

main()で呼び出される関数でstd :: uniform_real_distributionを使用しようとしています。主に次のようにメインで呼び出される関数でstd :: uniform_real_distributionを使用する

I)は、(ジェネレータのシード:

unsigned seed = 
std::chrono::system_clock::now().time_since_epoch().count(); 
std::default_random_engine generator (seed); 
std::uniform_real_distribution<double> distribution(0.0,1.0); 

さらに上の主に私が電話で

double number = distribution(generator) 

iは乱数を必要とするとき。

問題は、私も関数内の乱数の (何百万もの)が必要なことです。

は、i)は、(メインで呼び出す機能を想像:

int main(){ 

    void function(){ 

    number = distribution(generator) 
    } 

    return 0; 
} 

これを行うにはどのように?関数内の乱数ジェネレータにアクセスする方法

多くの感謝!

+5

? – NathanOliver

+1

時間をシードとして使用しないでください。ランダムではありません。 'std :: default_random_engine'を使用しないでください。これは悪いことです([example](https://stackoverflow.com/q/21843172/3002139))。私の質問[ここ](https://codereview.stackexchange.com/q/109260/47293)に適切なRNGを適切にシードする方法を見つけることができます。 –

答えて

0

あなたはそれから機能を作ることができます。私はstd::mt19937を乱数ジェネレータとして使用し、それに(少なくとも)std::random_deviceを播くことを推奨します。このような

何か:

inline 
double random_number(double min, double max) 
{ 
    // use thread_local to make this function thread safe 
    thread_local static std::mt19937 mt{std::random_device{}()}; 
    thread_local static std::uniform_real_distribution<double> dist; 
    using pick = std::uniform_real_distribution<double>::param_type; 

    return dist(mt, pick(min, max)); 
} 

int main() 
{ 
    for(int i = 0; i < 10; ++i) 
     std::cout << i << ": " << random_number(2.5, 3.9) << '\n'; 
} 

出力:あなたは関数に渡し

1: 3.73887 
2: 3.68129 
3: 3.41809 
4: 2.64881 
5: 2.93931 
6: 3.15629 
7: 2.76597 
8: 3.55753 
9: 2.90251 
+0

ありがとう!私はあなたのコメントを読んだ後、同様のことをしました。 (できます!) – daniel

関連する問題