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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 553 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

cs_mouahaha
Messages postés
210
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
LocalStone
Messages postés
515
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
}
?>
LocalStone
Messages postés
515
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.
cs_koko
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
cs_GRenard
Messages postés
1663
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

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.