別の場所で定義されており、呼び出されたときに、私は、乱数生成に関連する次のコードを含むマルチファイルのプログラムを書くためにしようとしている:help.hファイルで奇妙なRNG行動
:マサチューセッツ州
#include "help.h"
random_device rand_dev;
ranlux48 rand_eng{ rand_dev() };
uniform_real_distribution<> zero2one_dist(0, 1);
:help.cppファイル内
extern random_device rand_dev;
extern ranlux48 rand_eng;
extern uniform_real_distribution<> zero2one_dist;
in.cppファイル
#include "help.h"
//identical as help.cpp, just for illustration of the problem
random_device rand_dev1;
ranlux48 rand_eng1{ rand_dev1() };
uniform_real_distribution<> zero2one_dist1(0, 1);
//random number generation
float rnd1 = zero2one_dist1(rand_eng1);
float rnd2 = zero2one_dist(rand_eng);
//main function
int main()
{
//another random number generation.
float rnd3 = zero2one_dist(rand_eng);
//output
cout << rnd1 << endl << rnd2 << endl << rnd3 << endl;
return 0;
}
所望の結果は、0と1との間に3個の乱数を出力しているが、rnd1
とrnd3
適切な結果を生成するが、rnd2
は0を維持します!
が、私はここに完全に混乱している、外部ファイルの定義の違いは何でしょうhelp.hとmain.cppにで、コールとの違いは、内側とメインの外に何が()?
私の実際の仕事では、コードをrnd2
という形で書く必要がありますが、今はうまくいかず、理由がわかりません。
rnd1
,rnd2
とrnd3
の違いを誰にも示してもらえますか?rnd2
を利用できますか?ありがとう!
翻訳ユニット間の初期化順序の保証はありません。 'rnd2'は' zero2one_dist'の前後に初期化されます。実際に外部配布オブジェクトやヘルパー関数が必要な場合は、フォーム 'rnd3'を使用してください。 – spectras
@spectras ** help.cpp **ファイルにヘルプ関数を書いています: 'float rand_zero2one(){return zero2one_dist(rand_eng); } 'しかし、この関数を' rnd2 = rand_zero2one() 'のように呼び出すことはできません... – Wjx
@Wjx' rnd2'は一つの翻訳単位で静的なのでhelp.cppが偶数になる前に初期化されるかもしれませんそのコンストラクタを実行した。 –