我编写了以下类,用于从给定区间 [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 风格。
您能建议如何有效地做到这一点吗?
最佳答案
使用接受 const param_type &
的 uniform_int_distribution::operator()
的重载:
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
应该被模板化使用 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
关于c++ - 从变化的区间有效地生成伪随机整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15900568/