给定任意类型的随机数引擎 e,E我如何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值作为种子。
要便携式,只需unsigned long long与std::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,因为更高的比特将不会被使用。但是代码仍然可以移植到此类平台,并且仍然可以使用。
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |