Como simplificar este código (gera um int aleatória entre os valores mínimo e máximo de base em unsigned int)?

StackOverflow https://stackoverflow.com/questions/140786

  •  02-07-2019
  •  | 
  •  

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 ().

Foi útil?

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

@ Andrew Stein

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top