Генерация случайного uint64_t - PullRequest
0 голосов
/ 18 июня 2019

Учитывая механизм случайных чисел 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(???);
}

В частности, я пытаюсь запустить генератор случайных чисел xorshift из произвольного механизма e, а для генератора xorshift в качестве начальных значений нужны два значения uint64_t.

Ответы [ 2 ]

6 голосов
/ 18 июня 2019

Чтобы быть переносимым, просто используйте 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, причиной являются более высокие биты.будет просто неиспользованным.Но код все еще будет переносимым на такие платформы и будет работать.

0 голосов
/ 18 июня 2019
#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937_64 gen(rd());
    std::uniform_int_distribution<uint64_t> dis;

    std::cout << dis(gen) << '\n';
    return 0;
}

вы можете использовать dis(gen), чтобы генерировать больше случайных чисел.

...