私のプログラムでは、異なる範囲の疑似ランダム整数が必要です。今までは rand() 関数を使用していましたが、制限があります。
boost::random ライブラリがはるかに優れた代替手段であることがわかりましたが、ランダムジェネレーターをあちこちに作成したくありませんでした。
(すべての決定を疑似ランダムに行うストレステストソフトウェアであるため、多くのクラスでランダムな整数が必要です(->同じ開始シードを設定することにより、テストの実行を繰り返し可能にする必要があります))。
そのため、boost::random を自分のクラスにカプセル化しました。
この背後にある考え方は、C++ の rand() メソッドとほぼ同じくらい簡単に使用できるようにすることです。
#include "boost/shared_ptr.hpp"
#include "boost/random.hpp"
class Random{
public:
typedef boost::shared_ptr< Random > randomPtr;
typedef boost::mt19937 randomGeneratorType;
static randomPtr Get(){
static randomPtr randomGen( new RandomGenerator() );
return randomGen;
}
void SetSeed(int seed){
randomGenerator.seed( seed );
}
int Random( int lowerLimit, int upperLimit ){
boost::uniform_int<> distribution( lowerLimit, upperLimit );
boost::variate_generator< randomGeneratorType&, boost::uniform_int<> >
LimitedInt( randomGenerator , distribution );
return LimitedInt();
}
private:
// prevent creation of more than one object of the LogManager class
// use the Get() method to get a shared_ptr to the object
Random():
randomGenerator() //initialize randomGenerator with default constructor
{}
RandomGenerator( const RandomGenerator& orig ){};
randomGeneratorType randomGenerator;
};
特定の範囲内で乱数を生成することは、次のように簡単になります。
#include "Random.h"
Random::Get()->SetSeed( 123123 ); // If you want to make the run repeatable
int dice = Random::Get()->Random(1,6);
質問:
この乱数の生成方法に問題はありますか?
私が認識していなかった大きなオーバーヘッド?
純粋な悪か時代遅れのプログラミング技術か?
(私はまだ C++ に不慣れで、スキルを向上させたいと考えています。高品質のアドバイスを得るには、スタック オーバーフローが最適な場所であることがわかりました)