IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Random pondéré ?


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Par défaut [Tableaux] Random pondéré ?
    Bonjour,

    je voudrais savoir s'il existe une fonction random qui prend en compte une pondération

    Par exemple, si, dans un tableau, j'ai :
    pomme : 4
    poire : 1

    il y a 80% de chance que pomme soit choisi.

    Si ca existe pas je suppose que je vais devoir le programmer a la main

  2. #2
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Je ne crois pas que ça existe.
    J'avais eu a faire ca il y a bien longtemps, et j'avais du codé ma propre.

  3. #3
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Par défaut
    mmm ok ok...

    ca se fait comment? :o. ok pour dire qu on a 80% et 20% mais la question reste entière pour le random en fait....
    je n'aurai qu une idée très brutale qui consite à dire "si j'ai une pondération de 4 pour pomme, je le mets 4 fois ds un tableau" puis je fais un random sur ce tableau...

    mais bon je pense pas que ce soit la meilleure chose à faire niveau mémoire is j'ai une pondération de 10000 pour pomme, ca va pas le faire ^^

  4. #4
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    A l'époque, je debuttais, donc j'avais spécifier un interval de valeur pour chaque proba. exemple:
    pomme 40%, poire 60%
    je genere un nombre aléatoire entre 1 et 100
    si mon nombre est entre 1 et 40, c'est pomme
    si mon nombre est entre 41 et 100, c poire.

    Doit y'avoir mieux a faire, mais ça marchait ^^

  5. #5
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Par défaut
    lol tiens c'est pas bête ca c'est tjs mieux que ma proposition

    bahh si qq a qq chose de mieux a me proposer ... sinon je vais tenter la méthode de gloubi

  6. #6
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Par défaut
    Question un peu idiote avec le foreach ... C'est possible de l'arreter avec une condition? Je voudrais éviter qu il me parcourt tout le tableau si j'ai trouvé un résultat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $array = array('expression' => '8', 'poesie' => '3', 'album' => '1');
    foreach($array as $cle=>$valeur)
    {
    	$sum += $valeur;
    }
    foreach($array as $cle=>$valeur)
    {
    	$tmp += ($valeur/$sum)*10000;
    	$array_prob[$cle] = round($tmp,0);
    }
    $rdm_nombre = mt_rand(0,10000);
    foreach($array_prob as $cle => $valeur)
    {
    	if($rdm_nombre <= $valeur && $flag == 0)
    	{
    		$flag = 1;
    		$rdm_word = $cle;
    	}
    }
     
    echo $rdm_word;

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Par défaut Une solution
    Même si ça fait 4 ans, je viens d'être confronté au problème et
    effectivement je n'avais pas pensé à la solution de gloubi
    qui me semble géniale.

    Voici ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        function getRandomPonderedValues(array $aPonderedValues){
            $ratioTotal = array_sum($aPonderedValues);
            $resultat = rand(1, $ratioTotal);
            $trancheLimite = 0;
            foreach($aPonderedValues as $value => $ratio){
                $trancheLimite += (int)$ratio;
                if ($resultat <= $trancheLimite) {
                    return $value;
                }
            }
            return $value; // retourne la dernière valeur au cas où
        }
    et un code de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        $aPonderedValues = array(
            'pomme' => 0,
            'poire' => 6,
            'banane' => 0,
            'cassis' => 60,
        );
        echo getRandomPonderedValues($aPonderedValues);
    Merci gloubi.

Discussions similaires

  1. Tableaux de tableaux dans un objet avec random
    Par badibad dans le forum Langage
    Réponses: 1
    Dernier message: 23/06/2013, 14h21
  2. Tableaux et random en assembleur 8086
    Par samlk dans le forum x86 16-bits
    Réponses: 8
    Dernier message: 04/06/2011, 10h03
  3. [VxiR2] Pbm somme pondérées et tableaux croisés
    Par Jeff.p18 dans le forum Deski
    Réponses: 9
    Dernier message: 11/02/2010, 15h19
  4. [Tableaux] Comparaison pondérée de chaînes
    Par Nicomart dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2007, 13h00
  5. tableaux, random et document.write
    Par raph707 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/05/2006, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo