c++ - 从变化的区间有效地生成伪随机整数

标签 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 风格。

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

最佳答案

使用接受 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/

相关文章:

c++ - 模板如何影响 C++ 中的隐式声明规则?

c++ - 让类(class)与运营商合作的更简单方法?

c++ - 如何从 C++ 生成均匀分布在 0 和 1 之间的随机 double ?

c++ - 文字数字是否可变?

c++ - 在 Windows 上检查 RAM 中的剩余空间?

C++,避免 RTTI 和访问者模式,可能吗?

c - 如何在所有随机数都被使用之前不重复随机数?

python - 随机数字列表并将它们相加

c++ - 使用模板元编程将模板函数 bool 参数转置为运行时函数参数

c++ - 错误 C2672: 'operator __surrogate_func':使用 std::upper_bound 时未找到匹配的重载函数