Сгенерировать случайный длинный длинный С++

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);

Проблема

С этим есть две проблемы:

  1. Параметры для Distribution должны быть ints.
  2. Результатом Distribution(Mersenne) является int.

Вопрос

Как сгенерировать случайные long long вместо int, при этом параметры Min и Max также будут long longs вместо ints?

Контекст

Я создаю детерминированную игру (одноранговая архитектура), и большой минимальный размер long long необходим как своего рода число с фиксированной точкой (поскольку floats может вызвать недетерминизм).

Я не приму ответы, которые:

  • Используйте floats или doubles
  • Предложите создать int и преобразовать его в long long
  • Генерация случайных чисел недетерминированным образом (т. е. Мерсенн является детерминированным, если используется одно и то же начальное число)

Я бы предпочел решение из стандартной библиотеки, если оно есть.

В идеале решение должно быть не менее эффективным, чем мой существующий код на 64-битной машине.


person 0liveradam8    schedule 09.02.2021    source источник
comment
std::uniform_int_distribution<int64_t> ? Или я что-то упускаю?   -  person bolov    schedule 09.02.2021
comment
Просто проверьте документацию конструктора en.cppreference.com/w/cpp. /numeric/random/, в нем ясно сказано, что он использует тип члена, который может быть любым типом int.   -  person mediocrevegetable1    schedule 09.02.2021
comment
@bolov разве это не должно быть std::uniform_int_distribution<long long>?   -  person Wyck    schedule 09.02.2021
comment
Вопрос действителен, я не понимаю голосование против   -  person Adrian Maire    schedule 09.02.2021
comment
В источнике, из которого я получил код, не указан параметр шаблона для std::uniform_int_distribution<> (это касается даже примера кода на cppreference). Я даже не думал о том, для чего <>.   -  person 0liveradam8    schedule 09.02.2021
comment
@Wyck единственное законное использование long long - это когда вам нужно перегрузить / специализироваться для всех целочисленных типов. В противном случае используйте int или intN_t или любые другие целочисленные псевдонимы, определенные в cstdint.   -  person bolov    schedule 09.02.2021


Ответы (2)


документация говорит, что параметр шаблона может быть long long

long long Min = 3;
long long Max = 6;
std::uniform_int_distribution<long long> Distribution(Min, Max-1);

long long Result = Distribution(Mersenne);
person prog-fh    schedule 09.02.2021

Это сработает для вас?

#include <climits>
#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd()); // Here you can use any seed to make it deterministic
    std::uniform_int_distribution<long long> distrib(LLONG_MIN, LLONG_MAX);
    
    for (int n = 0; n < 5; ++n)
        std::cout << distrib(gen) << ' ';
    
    std::cout << '\n';
}
person no one special    schedule 09.02.2021