5

与えられた interval からランダムな整数を生成するために、次のクラスを作成しました[lower, upper]

 class RandomInteger {

protected:

    std::random_device randomDevice;
    std::default_random_engine randomEngine;
    std::uniform_int_distribution<> distribution;

public:

    RandomInteger(int64_t lower, int64_t upper);

    virtual ~RandomInteger();

    virtual int64_t generate();
};


RandomInteger::RandomInteger(int64_t lower, int64_t upper) : randomEngine(this->randomDevice()), distribution(lower, upper) {
}

RandomInteger::~RandomInteger() {
    // TODO Auto-generated destructor stub
}

int64_t RandomInteger::generate() {
    int64_t i = this->distribution(this->randomEngine);
    return i;
}

間隔が同じままで、複数の呼び出しgenerateが行われる場合、これは問題ありません。ただし、現在、私のユースケースは、常に変化している間隔から整数を生成しています (上限は毎回増加します)。

何よりもまず、これは高速である必要があります。これは暗号化とは関係がないため、非常に擬似的な乱数で問題ありstd::random_deviceません (おそらく必要ありません)。また、可能であれば C スタイルを避けて、最新の C++11 スタイルを使用したいと考えています。

これを効率的に行う方法を提案できますか?

4

1 に答える 1

2

uniform_int_distribution::operator()を受け入れるのオーバーロードを使用しconst param_type &ます。

int64_t RandomInteger::generate(int64_t lower, int64_t upper) {
    int64_t i = this->distribution(this->randomEngine,
      std::uniform_int_distribution<int64_t>{lower, upper}.param());
    return i;
}

distribution(を設定することに関心がないため、value-initialize を使用する必要があることに注意してくださいparam。また、int ではなくdistributionでテンプレート化する必要があります。)int64_t

状態を保持する場合uniform_int_distribution、これはそれを効率的に使用します。

実際には、 のほとんどの実装はuniform_int_distribution状態を保持しません。たとえば、libstdc++ random.tcc を参照してください: http://gcc.gnu.org/onlinedocs/gcc-4.6.0/libstdc++/api/a01001_source.html#l00832

于 2013-04-09T12:27:57.883 に答える