生成随机uint64_t

Bee*_*ope 0 c++ random c++14

给定任意类型的随机数引擎 eE我如何uint64_t在整个范围内生成随机数?

像这样的东西,其中needs_random()函数需要随机数uint64_t,并且blah()函数以现代<random>风格编写,可以接受任何类型的随机引擎E

void needs_random(uint64_t r);

template <typename E>
void blah(E& engine) {
  // ...
  needs_random(???);
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我正在尝试从任意引擎播种xorshift随机数生成器e,并且xorshift生成器需要两个uint64_t值作为种子。

Kam*_*Cuk 6

要便携式,只需unsigned long longstd::uniform_int_distribution(或您需要的任何其他发行版)一起使用:

#include <type_traits>
#include <cstdint>
#include <random>
#include <iostream>

void needs_random(uint64_t r) {
    std::cout << r << "\n";
}

template <typename E>
void blah(E& engine) {
    std::uniform_int_distribution<unsigned long long> dis(
        std::numeric_limits<std::uint64_t>::min(),
        std::numeric_limits<std::uint64_t>::max()
    );
    needs_random(dis(engine));
}

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    blah(gen);
    blah(gen);
}
Run Code Online (Sandbox Code Playgroud)

该类型unsigned long long保证至少为64位宽。从unsigned long long到的隐式整数转换uint64_t应仅提取数字的最低有效64位。

该代码只会在像这样的平台上不是最优的sizeof(unsigned long long) * CHAR_BIT > 64,因为更高的比特将不会被使用。但是代码仍然可以移植到此类平台,并且仍然可以使用。