… ou une occasion d’apprendre

Variable aléatoire et répartition selon la loi normale

Posté le 5 avril 2006 à 14:25

Dans le cadre du développement d’une simulation j’ai été confronté au problème des variables aléatoires. Ruby nous offre une fonction rand avec une répartition uniforme des résultats, c’est à dire que chaque valeur dans la plage de résultat conciédré comme valide (float entre 0 et 1 par défaut) à autant de chance que toutes les autres d’être renvoyé par la méthode.

Dans mon cas précis j’ai eu besoin d’orienter le résultat pour avoir une répartion selon la loi normale qui permet de faire un tirage qui tend plus ou moins vers une valeur moyenne définie. Ruby n’offre pas directement une méthode de ce type mais il existe des formules mathématique permetant de dériver d’un tirage aléatoire uniformément réparti une variable aléatoire répondant à cette loi.

Cette formule utilise deux variables aléatoires et deux paramètres (‘m’ et ’s’) et calcul sur cette base une nouvelle valeur. ‘m’ est la valeure médiane du tirage selon la loi normale, les résultats tendent vers cette valeur qui est également la moyenne des tirages et la valeur qui reviens donc le plus souvent. ’s’ permet de modifier la répartition, plus cette valeur est proche de 0, plus les résulats tendent vers la valeur médiane, au contraire si on augmente cette valeur les résultats vont s’étendre (pour une valeur très élevée, on tend vers une répartition uniforme autour de la valeur médiane).

 

La méthode random_normal reçois en paramètre ‘m’ et ’s’ dont j’ai parlé ci-dessus. Elle peut également utiliser deux paramêtres facultatifs, ‘min’ et ‘max’ qui définissent des bornes à la plage de résultat. Si un tirage est hors de cette plage il est effectué à nouveau jusqu’à avoir une valeur valide. Il est possible de définir qu’une des deux bornes, les deux ou aucune.

Il est toujours intéraissant de pouvoir tester une méthode comme celle-ci et avoir une représentation visuel des résultats pour ce faire une idée de ceux-ci. J’ai donc collecter les résultats d’un million d’appel à la méthode afin d’en tirer un certain nombre de statistiques (valeur maximum et minimum, valeur moyen, temps d’exécution) et une représentation graphique de la courbe de répartition des résultats.

‘m’, ’s’, ‘min’ et ‘max’ sont les paramètres de la méthode. ‘nb_tests’ est tout simplement le nombre de variable aléatoire qu’on veut récolter, ‘tic_length’ permet de configurer la largeur le la courbe à son point le plus haut, c’est à dire la valeur médiane.

Le fichier complet avec cette méthode, les testes et des commentaires est disponible en pièce jointe.