Tâche
Étant donné un entier positif n
inférieur à celui 2^30
spécifié en entrée de la manière que vous choisissez, votre code doit générer un entier aléatoire entre 0
et n
inclus. Le nombre que vous générez doit être choisi de manière uniforme et aléatoire . C'est-à-dire que chaque valeur de 0
à n
doit se produire avec une probabilité égale (voir Règles et mises en garde).
Règles et mises en garde
Votre code peut supposer que tout générateur de nombres aléatoires intégré à votre langue ou bibliothèque standard qui prétend être uniformément aléatoire est en fait uniforme. Vous n'avez donc pas à vous soucier de la qualité de la source aléatoire que vous utilisez. cependant,
- Vous devez établir que si la source aléatoire que vous utilisez est uniforme, votre code génère correctement un entier aléatoire uniforme de
0
àn
. - Tout argument lors de l'appel d'une fonction aléatoire intégrée ou de bibliothèque doit être constant. Autrement dit, ils doivent être complètement indépendants de la valeur d'entrée.
- Votre code peut se terminer avec la probabilité 1 plutôt que d'être garanti de se terminer.
Remarques
randInt(0,n)
n'est pas valide car il prend l'entrée comme argument d'une fonction intégrée ou de bibliothèque.rand()%n
ne pas donner un nombre aléatoire uniforme en général. À titre d'exemple donné par betseg, siintmax == 15
etn = 10
, alors vous aurez beaucoup plus de chances d'obtenir0-5
que6-10
.floor(randomfloat()*(n+1))
ne donnera pas non plus un nombre aléatoire uniforme en général en raison du nombre fini de différentes valeurs possibles en virgule flottante entre 0 et 1.
rng()
fournit0
-100
, sin = 75
et la fonction estrng()%75
, alors 0-25 sera plus courant ...)