Note qu'une solution est de ne pas prendre en compte les valeurs résiduelles, c'est à dire qui sont dans la dernière plage incomplète des modulos.
Ça se calcul facilement : 32768//6 * 6 = 32766.
Ici, on enlève tout ce qui est supérieur ou égale à 32766 :
do
r = $RANDOM
while r >= 32766
On obtient ainsi forcément un nombre compris entre 0 et 32765. Et donc une distribution parfaite.
Mais dans ce cas, le temps de génération (= nombre de boucles) n'est pas prévisible et peut être très long pour des modulos "pénibles" : ex, pour 993, il faut enlever les 992 dernières valeurs (cas pire <1000). Mais même pour 1000, il faut enlever les 768 dernières valeurs (le modulo est facile à calculer de tête). Et donc 2% de chance de faire au moins deux fois la boucle.
[^] # Re: Et en Java ?
Posté par steph1978 . En réponse au journal Parce que ca vaut largement un journal .... Évalué à 10.
Note qu'une solution est de ne pas prendre en compte les valeurs résiduelles, c'est à dire qui sont dans la dernière plage incomplète des modulos.
Ça se calcul facilement : 32768//6 * 6 = 32766.
Ici, on enlève tout ce qui est supérieur ou égale à 32766 :
do
r = $RANDOM
while r >= 32766
On obtient ainsi forcément un nombre compris entre 0 et 32765. Et donc une distribution parfaite.
Mais dans ce cas, le temps de génération (= nombre de boucles) n'est pas prévisible et peut être très long pour des modulos "pénibles" : ex, pour 993, il faut enlever les 992 dernières valeurs (cas pire <1000). Mais même pour 1000, il faut enlever les 768 dernières valeurs (le modulo est facile à calculer de tête). Et donc 2% de chance de faire au moins deux fois la boucle.