Чтобы быть переносимым, просто используйте 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);
}
Тип unsigned long long
гарантированно будет иметь ширину не менее 64 бит.Неявное целочисленное преобразование из unsigned long long
в uint64_t
должно извлекать только младшие 64 бита числа.
Этот код будет неоптимальным только на платформах, где, например, sizeof(unsigned long long) * CHAR_BIT > 64
, причиной являются более высокие биты.будет просто неиспользованным.Но код все еще будет переносимым на такие платформы и будет работать.