int
генератор
В настоящее время я генерирую детерминированные псевдослучайные int
, используя этот код:
#include <chrono>
#include <ctime>
#include <random>
#include <stdint.h>
const uint32_t CurrentTime = static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now().time_since_epoch()).count());
std::mt19937 Mersenne = std::mt19937(static_cast<std::mt19937::result_type>(CurrentTime));
int Min = 3;
int Max = 6;
std::uniform_int_distribution<> Distribution(Min, Max-1);
int Result = Distribution(Mersenne);
Проблема
С этим есть две проблемы:
- Параметры для
Distribution
должны бытьint
s. - Результатом
Distribution(Mersenne)
являетсяint
.
Вопрос
Как сгенерировать случайные long long
вместо int
, при этом параметры Min
и Max
также будут long long
s вместо int
s?
Контекст
Я создаю детерминированную игру (одноранговая архитектура), и большой минимальный размер long long
необходим как своего рода число с фиксированной точкой (поскольку float
s может вызвать недетерминизм).
Я не приму ответы, которые:
- Используйте
float
s илиdouble
s - Предложите создать
int
и преобразовать его вlong long
- Генерация случайных чисел недетерминированным образом (т. е. Мерсенн является детерминированным, если используется одно и то же начальное число)
Я бы предпочел решение из стандартной библиотеки, если оно есть.
В идеале решение должно быть не менее эффективным, чем мой существующий код на 64-битной машине.
std::uniform_int_distribution<int64_t>
? Или я что-то упускаю? - person bolov   schedule 09.02.2021std::uniform_int_distribution<long long>
? - person Wyck   schedule 09.02.2021std::uniform_int_distribution<>
(это касается даже примера кода на cppreference). Я даже не думал о том, для чего<>
. - person 0liveradam8   schedule 09.02.2021long long
- это когда вам нужно перегрузить / специализироваться для всех целочисленных типов. В противном случае используйтеint
илиintN_t
или любые другие целочисленные псевдонимы, определенные вcstdint
. - person bolov   schedule 09.02.2021