Compito
Dato un numero intero positivo n
inferiore a quello 2^30
specificato come input in qualsiasi modo tu scelga, il tuo codice dovrebbe generare un numero intero casuale compreso tra 0
e n
, incluso. Il numero che generi dovrebbe essere scelto in modo uniforme a caso . Questo significa che ogni valore da 0
a n
deve apparire con uguale probabilità (vedi Regole e Avvertenze).
Regole e avvertenze
Il tuo codice può presumere che qualsiasi generatore di numeri casuali incorporato nella tua lingua o libreria standard che afferma di essere uniformemente casuale sia in effetti uniforme. Cioè non devi preoccuparti della qualità della fonte casuale che stai usando. Tuttavia,
- Devi stabilire che se la sorgente casuale che stai usando è uniforme, il tuo codice emette correttamente un intero casuale uniforme da
0
an
. - Qualsiasi argomento quando si chiama una funzione casuale incorporata o in libreria deve essere costante. Cioè devono essere completamente indipendenti dal valore di input.
- Il tuo codice può terminare con probabilità 1 anziché essere garantito per terminare.
Gli appunti
randInt(0,n)
non è valido poiché accetta l'input come argomento per una funzione di libreria o incorporata.rand()%n
sarà non dare un numero casuale uniforme in generale. A titolo di esempio dato da betseg, seintmax == 15
en = 10
, allora si sarà molto più probabile per ottenere0-5
rispetto6-10
.floor(randomfloat()*(n+1))
inoltre non fornirà un numero casuale uniforme in generale a causa del numero finito di diversi possibili valori in virgola mobile compresi tra 0 e 1.
rng()
fornisce0
-100
, sen = 75
e la funzione èrng()%75
, allora 0-25 sarà più comune ...)