Fonction aléatoire qui prend en compte les probabilités ...

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 584 fois - Téléchargée 28 fois

Contenu du snippet

Salut à tous ...
Cette petite fonction est néé hier, pendant le repas du soir avec ma chere mère ... En fait, je me demendais comment on peut coder quelque chose qui permet de choisir aléatoirement entre, par exemple, 4 propositions que nous appellerons A B C et D, sachant que ces propositions ont des probabilités de tomber différentes, respectivement 0.1 0.2 0.3 et 0.4.
J'ai pas mal cherché ... Et en fait, c'est carrément tout con. Donc voilà ce que j'ai codé : la fonction ProbaRand();

Source / Exemple :


<?php
   //ProbaRand();
   function ProbaRand()
   {
      $arg_list = func_get_args();
      $tablo = array();
      $start = 0;
      foreach($arg_list as $arg_curr)
      {
         if(!is_array($arg_curr)){return (false);}
         $tempo = array();
         list($tempo['name'], $tempo['probability']) = $arg_curr;
         $tempo['start'] = $start;
         $tempo['end'] = $start + $tempo['probability'];
         $start += $tempo['probability'];
         array_push($tablo, $tempo);
      }
      $result = mt_rand(0, 1000)/1000;
      foreach($tablo as $once)
      {
         if($result >= $once['start'] AND $result <= $once['end'])
         {
            return($once['name']);
         }
      }
   }
  //Par exemple : ProbaRand(array('A', 0.1), array('B', 0.2), array('C', 0.3), array('D', 0.4));
?>

Conclusion :


Voilà voilà ... Bon, je le reconnais, y a moyen de faire plus cours et plus beau (parce que c'est quand même très moche), mais j'ai pas trop eu le temps. Pour info, j'ai testé avec les probas et les propositions citées ci-dessus, et pour 50 000 ... Disons, lancés on obtient :
A : 0.10138
B : 0.20062
C : 0.29818
D : 0.39982
Ce qui correspond bien aux probas énoncées.
Ce code peut par exemple servir dans certains jeux, ou l'ordinateur doit choisir entre une action et une autre, sachant que quelque chose le pousserait à en choisir une plus que l'autre ... C'est pas très clair, mais c'est pour ça que je vais l'utiliser.
Voilà, ++ !
LocalStone.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
209
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
6 avril 2009
1
pas mal du tout, ca peut être (c'est) un début d'IA...
bravo bravo
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

Vite fait, c'est juste pour faire un exemple concret ... On peut faire un jeu du style pile ou face :
<?php
if(isset($_GET['user']))
{
$user = $_GET['user'];
$result = ProbaRand(array('PILE', 0.5), array('FACE', 0.5));
if($user == $result){echo 'gagné !';}
else {echo 'perdu ...';}
}
else
{
?>
<form>
PILE ou FACE ?



</form>
<?php
}
?>
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

Bah c'est sympa, merci à tous les deux. Je vais changer pour mt_rand(), parce que tu as raison, ils disent que c'est mieux et plus rapide ...
++
LocalStone.
Messages postés
654
Date d'inscription
lundi 14 janvier 2002
Statut
Membre
Dernière intervention
20 février 2005

utilise mt_rand qui est mieux que rand ;)
sinon beau travail
Messages postés
1662
Date d'inscription
lundi 16 septembre 2002
Statut
Membre
Dernière intervention
30 juillet 2008
1
C'est très bien :)
et bien codé !
9/10
Afficher les 6 commentaires

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.