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 :

Random selon un % de chances


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2006
    Messages : 116
    Par défaut Random selon un % de chances
    Bonjour, j'aimerais savoir s'il est possible en PHP d'avoir un random dépendant d'un % de chance.

    Par exemple, pour un jeu, si l'on dit que le monstre M a 50% chances de donner l'item 1, 25% chance de donner l'item 2 et 0,1% chance de donner l'item 3.

    Donc:
    50% - 1
    25% - 2
    0,1% - 3

    L'item 1 a le plus de chance d'être donné car il a le plus haut %.

    Pour le moment j'avais pensé me faire une table qui ressemblerait à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    monstre -- item -- prc
    M          1       50
    M          2       25
    M          3       0.1
    et dans mon code j'aurais fais quelque chose comme...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $drop = array();
    foreach($itemSQL as $item)
    {
       for($i=0;$i<=$item['prc'];$i++)
          {
             array_push($drop, $item['item']);
          }
    }
     
    $randDrop = rand(0,count($drop));
    $currDrop = $drop[$randDrop];
    mais il doit bien y exister une autre méthode plus efficace?

    Merci d'avance

    EDIT: De plus, ma méthode ne gère pas les 0,1% a moins de multiplier le tout par 10 et la... c'est encore pire :S (750 données dans un tableau, bien que rapide, je ne crois aucunement que ce soit saint ^^)

  2. #2
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    Je n'en connais malheureusement aucune mais je suis sur qu'il doit y en avoir d'autres plus économiques en mémoire. Sa vaut le coup d'y réfléchir

  3. #3
    Membre émérite Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Par défaut
    C'est UNE solution

    Code php : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    function prsort($a, $b)
    {
    	if ($a['pound'] == $b['pound'])
    	{
    		return 0;
    	}
     
    	return ($a['pound'] > $b['pound']) ? 1 : -1;
    }
     
    function array_prand($array, $pounds = array())
    {
    	$parray = array();
    	$ptotal = 0;
     
    	foreach ($array as $key=>$value)
    	{
    		$eff = (isset($pounds[$value]) && !empty($pounds[$value])) ? $pounds[$value] : 1;
    		$parray[$key] = array('value' => $value, 'pound' => $eff);
    		$ptotal += $eff;
    	}
     
    	uasort($parray, 'prsort');
     
    	$random = rand(1, $ptotal);
     
    	$total = 0;
    	foreach ($parray as $key=>$value)
    	{
    		if( $random > $total && $random <= ($total + $value['pound']))
    			break;
     
    		$total += $value['pound'];
    	}
     
    	return $key;
    }
     
    $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
    $pounds = array(5 => 3);
     
    echo( $array[array_prand($array, $pounds)] );

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 171
    Par défaut
    Bonjour,

    Une autre proposition.

    Tu prends un intervalle [0 ,1] que tu divises en fonction de tes probabilités.
    Dans ton cas par exemple :
    [0; 0,5] -> item1
    ]0,5; 0,75 ] -> item2
    ]0.75; 0.85] -> item3
    etc

    Admettons maintenant que tu aies une fonction qui te retourne un nombre aléatoire entre 0 et 1 de manière uniforme ( rand(0,1) )

    Tu détermines l'item par l'intervalle dans lequel se situe le retour de la fonction.

Discussions similaires

  1. [MySQL] Tirage au sort selon pourcentage de chance
    Par vinze60 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 25/01/2010, 08h53
  2. [MySQL] Random selon une PRIORITE
    Par phplover dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/02/2009, 16h19
  3. [VB6] : pour faire un Randomize sous vb... merci
    Par delnic dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/01/2003, 15h49
  4. Random en Assembleur
    Par funx dans le forum Assembleur
    Réponses: 9
    Dernier message: 02/09/2002, 17h05
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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