Bug randomrange

Description

Suite à l'étude du code proposé par florenth (http://www.delphifr.com/code.aspx?ID=34509) je me suis aperçu d'une erreur dans le code de la fonction RandomRange de l'unité Math.pas. En effet si l'on demande par exemple des nombres aléatoires de 3 à 8, la fonction renvoie des nombres de 3 à 7 !!

Voici le correctif à apporter.

Source / Exemple :


// ----- Code modifié ----- //
function RandomRange(const AFrom, ATo: Integer): Integer;
begin
  if AFrom > ATo then
    Result := Random(AFrom - ATo + 1 ) + ATo
  else
    Result := Random(ATo - AFrom + 1 ) + AFrom;
end;

Conclusion :


Quelques explications, sur la modification de la fonction originelle :

// ----- Code originel ----- //
function RandomRange(const AFrom, ATo: Integer): Integer;
begin
if AFrom > ATo then
Result := Random(AFrom - ATo) + ATo
else
Result := Random(ATo - AFrom) + AFrom;
end;

Supposons que Afrom=2 et ATo=3, dans ce cas, on aura Random(3-2)+2 soit Random(1)+2
0 <= Random(X) < X
0 <= Random(1) < 1
2 <= Random(1)+2 < 3, la fonction RandomRange ne renverra que des 2 !!!!

Supposons que Afrom=1 et ATo=5, dans ce cas, on aura Random(5-1)+1 soit Random(4)+1
0 <= Random(X) < X
0 <= Random(4) < 4
1 <= Random(4)+1 < 5, la fonction RandomRange renverra des nombres compris entre 1 et 4 !!!! et non 1 et 5

Pour utiliser le correctif, soit vous recompilez l'unité Math.pas en modifiant la source (pour ceux qu'ils l'ont), soit vous intégrez ce code dans une autre unité, par exemple CorrectifMath.pas (fichier joint)
L'appel de la fonction se fera en incluant l'unité dans la clause uses, puis en spécifiant au compilateur l'unité à utiliser :

RandomRange(1,5); // Appel de la fonction originelle
Math.RandomRange(1,5)); // Appel de la fonction originelle
CorrectifMath.RandomRange(1,5)); // Appel de la fonction corrigée

Cordialement.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.