Como simplificar este código (gera um int aleatória entre os valores mínimo e máximo de base em unsigned int)?
Pergunta
O código é
return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
(number / (UINT_MAX + 1.0)));
número é um número aleatório obtido por rand_s. MIN e MAX são inteiros e representam os valores mínimos e máximos (inclusive).
Se você fornecer uma solução não usar unsigned int como um número, explique também como fazê-lo ser aleatória.
Por favor, não submeta soluções usando rand ().
Solução
O static_cast<double>
é redundante porque os "+1.0" s fará com que a promoção para o dobro de qualquer maneira.
Outras dicas
Em receitas numéricas em C: a arte de Computação Científica (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 1992 (2ª ed., P. 277)), os seguintes comentários são feitas:
"Se você deseja gerar um aleatório inteiro entre 1 e 10, você deve sempre fazê-lo usando bits de ordem superior, como em
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
e nunca por qualquer coisa parecida com
j = 1 + (rand() % 10);
(que usa os bits de ordem inferior). "
De man 3 rand
Como sobre Boost: aleatória
Você poderia fazer a aritmética em um unsigned long long em vez de um duplo, mas só se ULONGLONG_MAX> = UINT_MAX * UINT_MAX, que é provavelmente a implementação definida. Mas se você está preocupado com isso, você estaria preocupado com potencial perda de precisão no código original no caso. (Max - min) ou RAND_MAX é grande
Se o longo tempo é realmente mais rápido pode depender quão bom flutuador hardware de sua plataforma é. Mas inteiro aritmética, sem dúvida, é inerentemente mais simples do ponto flutuante.
Algo como
min + number % (max - min + 1)
Verifique os casos de finais