有效地从变化的间隔生成伪随机整数

时间:2013-04-09 11:24:46

标签: c++ random c++11 integer

我编写了以下类来生成给定间隔[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风格。

你能建议如何有效地做到这一点吗?

1 个答案:

答案 0 :(得分:2)

使用接受uniform_int_distribution::operator()的{​​{1}}的重载:

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不感兴趣。此外,param应使用distribution模板化,而不是int {} 。)

如果int64_t保留任何状态,那么这将有效地使用它。

实际上,uniform_int_distribution的大多数实现都不保留任何状态;见例如libstdc ++ random.tcc:http://gcc.gnu.org/onlinedocs/gcc-4.6.0/libstdc++/api/a01001_source.html#l00832