Qual è l’algoritmo ottimale per generare un numero intero casuale imparziale in un intervallo?

In questa domanda StackOverflow:

Generazione di un numero intero casuale da un intervallo

la risposta accettata suggerisce la seguente formula per generare un numero intero casuale compreso tra min e max , con min e max inclusi nell’intervallo:

 output = min + (rand() % (int)(max - min + 1)) 

Ma lo dice anche questo

Questo è ancora leggermente sbilanciato verso numeri più bassi … È anche ansible estenderlo in modo che rimuova il bias.

    Ma non spiega perché è prevenuto verso numeri più bassi o come rimuovere il pregiudizio. Quindi, la domanda è: è questo l’approccio più ottimale alla generazione di un intero casuale all’interno di un intervallo (firmato) pur non facendo affidamento su nessuna funzione di fantasia, solo rand() , e nel caso in cui sia ottimale, come rimuovere il bias ?

    MODIFICARE:

    Ho appena testato l’algoritmo -loop while suggerito da @Joey contro l’estrapolazione in virgola mobile:

     static const double s_invRandMax = 1.0/((double)RAND_MAX + 1.0); return min + (int)(((double)(max + 1 - min))*rand()*s_invRandMax); 

    per vedere quanto “palle” uniformsmente “cadono” e vengono distribuite tra un certo numero di “bucket”, un test per l’estrapolazione in virgola mobile e un altro per l’algoritmo -loop while . Ma i risultati si sono rivelati diversi a seconda del numero di “palle” (e “secchi”), quindi non ho potuto facilmente scegliere un vincitore. Il codice di lavoro può essere trovato in questa pagina di Ideone . Ad esempio, con 10 bucket e 100 sfere la deviazione massima dalla probabilità ideale tra i bucket è inferiore per l’estrapolazione in virgola mobile che per l’algoritmo -loop while (0,04 e 0,05 rispettivamente) ma con 1000 sfere, la deviazione massima del while l’algoritmo -loop è minore (0.024 e 0.011), e con 10000 sfere, l’estrapolazione in virgola mobile sta di nuovo andando meglio (0,0034 e 0,0053), e così via senza molta coerenza. Pensare alla possibilità che nessuno degli algoritmi produca coerentemente una distribuzione uniforms migliore di quella dell’altro algoritmo, mi spinge verso l’estrapolazione in virgola mobile poiché sembra eseguire un algoritmo più veloce del while . Quindi è giusto scegliere l’algoritmo di estrapolazione in virgola mobile o i miei test / conclusioni non sono completamente corretti?