If you're seeing this message, it means we're having trouble loading external resources on our website.

Si vous avez un filtre web, veuillez vous assurer que les domaines *. kastatic.org et *. kasandbox.org sont autorisés.

Contenu principal

Nombres aléatoires suivant une loi personnalisée

Il arrivera un moment où vous souhaiterez des nombres aléatoires qui ne suivent ni une loi de probabilité uniforme, ni une loi gaussienne. Imaginons un instant que vous êtes un marcheur aléatoire en quête de nourriture. Vous déplacer au hasard dans un environnement semble être une stratégie raisonnable pour trouver quelque chose à manger. Après tout, vous ne savez pas où la nourriture se trouve, vous pouvez donc chercher ainsi jusqu'à ce que vous la trouviez. Le problème, comme vous l'avez peut-être déjà remarqué, est que le marcheur aléatoire retourne souvent sur ses pas, donc des emplacements déjà visités (ceci est connu comme étant du “suréchantillonnage”). Une technique pour éviter ce problème, consiste, de temps à autre, à faire un très grand pas. Cela permet au marcheur de chercher de la nourriture aléatoirement autour d'un emplacement spécifique, et, périodiquement, sauter très loin pour réduire la quantité de suréchantillonage. Cette variante de la marche aléatoire (connue comme les vols de Lévy) requiert une loi de probabilité personnalisée. Même si ce n'est pas une implémentation exacte des vols de Lévy, nous pouvons établir une loi de probabilité de cette manière : plus le pas est long, moins il a de chance de se produire, plus le pas est court, plus il a de chance de se produire.
Précédemment dans ce module, nous avons vu comment générer une loi de probabilité personnalisée en remplissant un tableau avec des valeurs (certaines étant dupliquées afin d'être choisies plus fréquemment) ou en testant le résultat de la fonction random(). Implémentons les vols de Lévy en déclarant qu'il y a 1% de chance que le marcheur fasse un grand pas.
var r = random(1);
// 1% de chance de faire un grand pas
if (r < 0{,}01) {
    xstep = random(-100, 100);
    ystep = random(-100, 100);
} else {
    xstep = random(-1, 1);
    ystep = random(-1, 1);
}
Les probabilités sont cependant limitées à un nombre fixe d'options. Et si nous souhaitions une loi plus globale (plus le nombre aléatoire est élevé, plus il a de chance d'être choisi) ? 3,145 serait plus susceptible d'être choisi que 3,144, même si la probabilité est à peine supérieure. En d'autres termes, si x est le nombre aléatoire, nous pouvons tracer la probabilité sur l'axe des ordonnées y en écrivant y = x.
Image de Nature of Code
Figure I.4
Si nous arrivons à déterminer un moyen de générer des nombres aléatoires suivant une loi correspondant au graphique ci-dessus, alors nous serons en mesure d'appliquer cette même méthodologie pour n'importe quelle courbe dont nous connaissons l'équation de la fonction.
Une solution consiste à choisir deux nombres aléatoires, et non un. Le premier nombre aléatoire est juste, un nombre aléatoire. Le second sera ce que nous appelons une “valeur aléatoire de qualification”. Elle nous permettra de déterminer si on doit utiliser le premier nombre aléatoire ou si on doit l'oublier pour en tirer un autre. Les nombres qui auront une probabilité de qualification élevée seront plus souvent tirés et ceux ayant une probabilité de qualification basse seront moins souvent tirés. Voici les étapes du processus (pour l'instant, nous ne considérons que des valeurs aléatoires situées entre 0 et 1) :
  1. Tirer un nombre aléatoire : R1
  2. Calculer une probabilité P de qualification pour R1. Essayons : P = R1.
  3. Tirer un autre nombre aléatoire : R2
  4. Si R2 est plus petit que P, alors le nombre est trouvé : R1 !
  5. Si R2 n'est pas plus petit que P, recommencer à partir de l'étape 1.
Nous avons calculé, ici, une probabilité de qualification égale au nombre aléatoire lui-même. Si nous tirons 0,1 pour R1, R1 aura 10% de chance d'être qualifié. Avec une valeur de 0,83, il en aura 83%. Ainsi, plus il est élevé, plus la probabilité est grande qu'il soit choisi.
Voici une fonction (nommé d'après la méthode de Monte-Carlo, qui elle-même a été baptisée ainsi du nom du casino de Monte-Carlo) représentant l'algorithme ci-dessus, en retournant une valeur aléatoire entre 0 et 1. Ce programme utilise les valeurs pour déterminer la taille des ellipses, mais nous pourrions les utiliser pour beaucoup d'autres choses.

Ce cours sur les "simulations de phénomènes naturels" est dérivé de l'ouvrage "The Nature of Code" de Daniel Shiffman, utilisé sous licence Creative Commons Attribution-NonCommercial 3.0 Unported License.

Vous souhaitez rejoindre la discussion ?

Pas encore de posts.
Vous comprenez l'anglais ? Cliquez ici pour participer à d'autres discussions sur Khan Academy en anglais.