5

我编写了以下类,用于从给定的区间生成随机整数[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()接受 a的重载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;
}

(请注意,您应该 value-initialize distribution,因为您对设置它不感兴趣param。此外,distribution应该使用 模板int64_t,而不是 int。)

如果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 回答