Come semplificare questo codice (genera un int casuale tra base min e max su int senza segno)?
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 ().
Soluzione
static_cast<double>
è ridondante perché le " +1.0 " faranno comunque raddoppiare la promozione.
Altri suggerimenti
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