Как генерировать 64-битные случайные числа?

Я реализую универсальное хеширование и использую следующую универсальную хеш-функцию:

h (k) = ((A * k) mod 2 ^ 64) rsh 64-р

где A - случайное число между

2^61 и 2^62.

rand() Функция в C++ имеет тип возвращаемого целого числа и не может генерировать такие большие числа. Итак, как я могу генерировать случайные числа в этом диапазоне? (числа должны быть очень случайными, т. е. каждое число должно иметь одинаковую вероятность выбора)

Замечания:

long long int random=rand();

не работает как число, возвращаемое rand это инт.

2 ответа

Решение

В C++11 вы можете использовать случайный заголовок и std::iform_int_distribution вместе с 64-битным экземпляром std::mersenne_twister_engine, это должно делать то, что вы хотите ( смотрите вживую):

#include <iostream>
#include <random>
#include <cmath>

int main()
{
    std::random_device rd;

    std::mt19937_64 e2(rd());

    std::uniform_int_distribution<long long int> dist(std::llround(std::pow(2,61)), std::llround(std::pow(2,62)));

    std::cout << std::llround(std::pow(2,61)) << std::endl; 
    std::cout << std::llround(std::pow(2,62)) << std::endl; 

    for (int n = 0; n < 10; ++n) {
            std::cout << dist(e2)<< ", " ;
    }
    std::cout << std::endl ;
}

Если C++11 не вариант, то кажется, что есть исходный код для нескольких 64-битных реализаций Mersenne Twister.

((long long)rand() << 32) | rand()

РЕДАКТИРОВАТЬ: это предполагает, что rand() генерирует 32 случайных бита, чего не может быть.

Другие вопросы по тегам