Citation:
Envoyé par casafa
1)Pourquoi la répartition n'est pas équiprobable ?
La FAQ confond deux problemes.
2/ rand genere des nombres equirepartit entre 0 et RAND_MAX inclus. Les deux procedures de choix d'un nombre entre 0 et N (non inclus cette fois), revienne a repartir les nombres entre 0 et RAND_MAX en N ensemble de taille egale si on veut aussi une equirepartition. Ce que ne font pas les procedures de la FAQ si RAND_MAX+1 n'est pas un multiple de N. (Pour le verifier, prenons RAND_MAX=15 et cherchons a avoir des nombres entre 0 et 10, la methode avec modulo favorise 0, 1, 2, 3, 4 et 5 qui seront tires deux fois plus souvent que 6, 7, 8 et 9; la methode avec les float favorise d'autres nombres mais en favorise aussi).
Pour eviter les deux problemes, il faut faire quelque chose du genre
Code:
1 2 3 4 5 6 7 8 9 10 11
| int alea(int n)
{
assert (0 < n && n-1 <= RAND_MAX);
int partSize = 1 + (RAND_MAX - (n-1)) / n;
int maxUsefull = partSize * n;
int draw;
do {
draw = rand();
} while (draw >= maxUsefull);
return draw/partSize;
} |
(Les petites complications dans le calcul de partSize sont la pour traiter le cas ou RAND_MAX=INT_MAX).