Come semplificare questo codice (genera un int casuale tra base min e max su int senza segno)?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Il codice è

return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
  (number / (UINT_MAX + 1.0)));

numero è un numero casuale ottenuto da rand_s. min e max sono ints e rappresentano i valori minimo e massimo (inclusi).

Se fornisci una soluzione che non utilizza int non firmato come numero, spiega anche come renderla casuale.

Non inviare soluzioni utilizzando rand ().

È stato utile?

Soluzione

static_cast<double> è ridondante perché le " +1.0 " faranno comunque raddoppiare la promozione.

Altri suggerimenti

@ Andrew Stein

In Ricette numeriche in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 1992 (2a ed., p. 277)), vengono fatti i seguenti commenti:

  

" Se si desidera generare un casuale   numero intero compreso tra 1 e 10, dovresti   fallo sempre usando bit di ordine elevato,   come in

     

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

     

e mai vicino   qualcosa che assomigli

     

j = 1 + (rand() % 10);

     

(che utilizza bit di ordine inferiore). "

Da man 3 rand

Che ne dici di Boost: Random

Potresti eseguire l'aritmetica in un unsigned long long anziché in double, ma solo se ULONGLONG_MAX > = UINT_MAX * UINT_MAX, che è probabilmente definito dall'implementazione. Ma se sei preoccupato per questo, ti preoccuperesti di una potenziale perdita di precisione nel codice originale nel caso in cui (max - min) o RAND_MAX è grande.

Se il long long sia effettivamente più veloce potrebbe dipendere da quanto è buono il float hardware della tua piattaforma. Ma l'aritmetica dei numeri interi è probabilmente intrinsecamente più semplice del virgola mobile.

Qualcosa di simile

min + number % (max - min + 1)

Controlla i casi finali

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top