Como usar operator()(Generator& g, const param_type& params);
o std::uniform_int_distribution
. Este é o meu código
#include <iostream>
#include <random>
int get_random_int(const int lower_limit, const int upper_limit) {
std::random_device rd{};
std::mt19937 gen{rd()};
static std::uniform_int_distribution<> dist;
// use operator()(Generator& g, const param_type& params);
return dist(gen, lower_limit, upper_limit);
}
int main() {
std::cout << get_random_int(1, 1000000) << std::endl;
}
Você precisa criar um objeto do tipo
param_type
.Você pode encurtar o nome para
decltype(dist)::param_type
, embora a sintaxe não seja muito mais legível na minha opinião. O alias do nome também o tornaria mais curto e mais limpo.A construção implícita simplesmente
{lower_limit, upper_limit}
não funciona: https://godbolt.org/z/4cr3f758K , embora eu não veja um requisito no cppreference que exijaexplicit
o construtor.Além disso, observe que a parte cara da operação é configurar o mecanismo de números aleatórios (aqui
std::mt19937
), não a distribuição em si. Seria melhor (e mais fácil) fazer issostatic
:Um pouco fora do assunto, mas seu código tem problemas e a coisa errada é declarada como
static
.std::random_device
é lento e é um verdadeiro gerador aleatório (se suportado pela plataforma), deve ser usado apenas uma vez. Quando você usa isso várias vezes, não precisastd::mt19937
std::mt19937
a inicialização é um pouco cara. Isto é o que você deve fazerstatic
.std::uniform_int_distribution
é uma coisa simples, ele apenas contém o intervalo para o qual valores aleatórios devem ser gerados; portanto, não faz sentido considerá-lo estático e é muito barato criá-lo em cada chamada.Então, eu corrigiria seu código desta forma:
https://godbolt.org/z/oahEEoM9d
Não parece que você está pedindo, mas faz o que você precisa de uma maneira menos volumosa.
Versão onde apenas dispositivos aleatórios são usados em cada chamada: https://godbolt.org/z/96Yd51hz7
Aqui está uma demonstração de como o compilador é capaz de otimizar esse código: https://godbolt.org/z/rP7vfMoW7 (o código foi cortado para que a montagem seja mais fácil de ler).