cls*_*udt 5 c++ random integer c++11
我编写了以下类来从给定的时间间隔生成随机整数[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;
}
Run Code Online (Sandbox Code Playgroud)
如果间隔保持不变并且进行多次调用,这是可以的generate.但是,现在我的用例是从一个始终在变化的区间生成整数(每次上限都会增加).
首先,这需要快速.这与加密无关,因此非常伪随机数是可以的(并且std::random_device可能不需要).如果可能的话,我也想避免使用C风格,并使用现代的C++ 11风格.
你能建议如何有效地做到这一点吗?
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;
}
Run Code Online (Sandbox Code Playgroud)
(请注意,您应该 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
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |