Bonjour,
C'est malheureusement hors-sujet par rapport au poste initial, mais je n'arrive pas à ne revenir sur le caractère aléatoire d'une distrib calculée avec un modulo.
Supposons une distribution uniforme sur l'intervalle [1:N].
La distribution étant uniforme, chaque entrée a une probabilité 1/N de sortir.
On souhaite maintenant construire une distribution la plus uniforme possible sur un intervalle [1:M], avec M < N.
Dans notre boîte à outils, on ne dispose que d'un générateur aléatoire [1:N] et des opérateurs communs qu'on ne sait utiliser qu'avec des nombres entiers relatifs.
On a par ailleurs N = M * q + r, ou q est le quotient et r le reste de la division euclidienne de N par M.
On construit la distribution comme suit : RANDOM(N)%M+1
Donc pour la distribution [1:M], les nombres [1:r] ont une probabilité de sortir de (q+1)/N, et les nombres compris entre [r+1:M] ont une probabilité de sortir de q/N.Code:
1
2
3
4
5
6
7 Soit n issu de RANDOM[1:N], avec 1 <= n <= M probabilité 1/N. On le met dans la distrib [1:M] ---- n ---- -- ------------ ---- M+1 <= n <= 2*M ----------- ---. -- -- --- ---- -- ------- [1:M] [...] [...] [...] ---- n ---- -- ------------ ---- (q-1)*M+1 <= n <= q*M ----------- ---. -- -- --- ---- -- ------- [1:M] ---- n ---- -- ------------ ---- q*M+1 <= n <= N=q*M+r ----------- ---. -- ------ ---- -- ------- [1:r]
C'est à dire :
Les nombres m <= r ont (q+1)/q = 1 + 1/q fois plus de chances que les autres de sortir, ce qui n'est pas très uniforme... Mais plus q est grand, soit plus N est immense devant M, plus l'erreur est moindre.
Si on prend un N trop juste mais dont on a l'impression qu'il est plus calibré pour le problème, tel que M < N < 2M par exemple, comme tu l'avais suggéré, on a q=1. Ca veut dire que les nombres compris entre [1:r] ont... 2 fois plus de chances de sortir que les autres. Peu importe leur nombre au sein de la distribution, l'erreur sur l'uniformité est énorme lors du passage à l'échelle, et si l'aléatoire que l'on met dans le problème est important, c'est rédhibitoire.
Si N > 1000 * M, c'est franchement pas top non plus si l'aléatoire est important, mais au moins, 1.001 fois plus de chances est mieux que 2 fois plus...
En conclusion, il faut raisonner sur l'erreur relative d'uniformité dans la distribution, et non la proportion des cas "non canoniques" de la distribution. En effet, qu'il y en ai peu ou beaucoup, si l'erreur est grande, lors du passage à l'échelle (nombre de tirage -> infini), les problèmes vont se voir plus que le nez au milieu de la figure (même avec un gros nez).
Et pour contrôler au mieux les problèmes d'erreur, réaliser les étapes biaisantes le plus tard possible pour ne pas avoir à réfléchir à la propagation des biais. Donc ici, prendre le modulo une seule fois à la fin.
Pour le pendu, osef, je suis bien d'accord.
Après, si on a vraiment besoin de l'aléatoire, on prend le problème au sérieux et on utilise autre chose que la fonction de RANDOM qui retourne des entiers signés de 16 bits... Et on prend encore moins une distribution obtenue en multipliant deux entiers randoms sur 16 pour simuler une distrib uniforme sur 32 bits (enfin sur 31 bits, car on a un bit de signe dans chaque distrib sur 16 bits, donc un bit de perdu par rapport à des entiers sur 32 bits signés...) (bah oui car, en dehors de la densité odd/even, quid par exemple des nombres premiers supérieurs à l'entier le plus grand codé sur 16 bits ? il n'y en a pas par définition (!), vu qu'on obtient ces nombre par multiplication)

