C++ 11以前は<cstdlib>
のrand()
を使用していましたが、main()
関数でジェネレータをシード(または生成しない)することは非常に簡単でした。たとえば、libraryBのどこかの関数で生成された乱数。コードは次のように見えた:C++での乱数11:コードの1つの場所にジェネレータをシードして別の関数で使用する簡単な方法はありますか?
LibraryB(乱数、昔ながらの方法を生成します):
#include <cstdlib> // rand, RAND_MAX
double GetRandDoubleBetween0And1() {
return ((double)rand())/((double)RAND_MAX);
}
主なプログラム:
#include <cstdlib> // srand
#include <ctime> // time, clock
int main() {
bool iWantToSeed = true; // or false,
// decide HERE, applies everywhere!
if(iWantToSeed){
srand((unsigned)time(0) + (unsigned int)clock());
}
// (...)
}
LibraryAは(に応じて生成された、LibraryBから乱数を使用していますmain()
で与えられる種):
#include "../folderOfLibraryB/Utils_random.h" // GetRandDoubleBetween0And1
void UseSomeRandomness(){
for(int i = 0; i < 1000000; i++){
double nb = GetRandDoubleBetween0And1();
// (...)
}
}
簡単ですね。
#include <random>
で利用可能なC++ 11標準を使用してGetRandDoubleBetween0And1()
を更新したいと思います。私はすでにhereとthereの例を読んで見ましたが、3つのモジュールにどのように適合させるかはわかりません。確かに、GetRandDoubleBetween0And1()
の内側にエンジンを播種して行うには正しいことではありません...
私はLibraryBで、その後UseSomeRandomness()
からGetRandDoubleBetween0And1()
に、LibraryAにmain()
からUseSomeRandomness()
にシードされたエンジンを渡す必要がありますと思いますか?それとも簡単な方法がありますか? LibraryBでLibraryAで、その後、UseSomeRandomness()からGetRandDoubleBetween0And1へ
私の既存のコードのためにどのような悪いニュース! – Georg