begin process at 2012 05 31 10:38:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Général

 > 

Tirage au sort avec poids


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Tirage au sort avec poids

lundi 26 octobre 2009 à 11:17:01 | Tirage au sort avec poids

Pekka


salut à tous,

Je voudrais tirer au sort une personne mais ces personnes ont plus ou moins de chance :

Code PHP :
$tab[1] = 10;
$tab[2] = 100;
$tab[3] = 1000;
$tab[4] = 900;


ce qui veut dire en français , que le joueur 1 a 10 chance de gagner, les joueur 2 a 100 chances, ...

Je ne sais pas comment avantage le joueur 3 dans le tirage.

Merci de votre aide.
mardi 27 octobre 2009 à 03:22:51 | Re : Tirage au sort avec poids

Arto_8000

La façon la plus simple d'aborder le problème serait d'avoir un algorithme dans ce genre :

Code PHP :
<?php
$total = 0;
for ($i=0;$i<count($tab); $i++)
    $total += $tab[$i];

$rdNumber = rand() * $total;
$seek = 0;
$resultat = 0;
for ($i=0; $i<count($tab); $i++) {
    if ($rdNumber <= $seek+$tab[$i]) {
        $resultat = $i;
        break;
    }
    $seek += $tab[$i];
}

echo 'Le résultat gagnant est le ' . $resultat;
?>


En gros ce que l'algorithme fait c'est d'additionner toutes les chances et après on prend le nombre aléatoire qui nous mène vers notre chiffre.

Dans ton cas la sommes est 2010. Si le nombre aléatoire est entre 0 et 10, c'est le 1 qui gagne, entre 10 et 110 c'est le 2 qui gagne, entre 110 et 1110, c'est le 3 qui gagne, etc.
jeudi 29 octobre 2009 à 17:53:51 | Re : Tirage au sort avec poids

Pekka

Merci,

J'avais pensé à cette solution mais je trouve qu'une boucle pour faire des additions c'est pas terrible si j'ai beaucoup de joueur.
Qu'est que tu en penses?
jeudi 29 octobre 2009 à 18:34:09 | Re : Tirage au sort avec poids

Arto_8000

La boucle pour les additions c'est à peu près inévitable, car il faut savoir la somme des chances que tout le monde a eu. Tu peux toujours le précalculé et le stocké quelque part pour éviter d'avoir à le faire à chaque tirage, mais tu ne peux pas t'en passer.

Sinon l'algorithme en soi peut être optimisé, mais le principe va reste le même.
jeudi 29 octobre 2009 à 23:51:06 | Re : Tirage au sort avec poids

kohntark

Membre Club
Salut,

@Arto:
J'ai peut être loupé quelque chose mais je doute que ton code fonctionne, ne serait ce que par le "$rdNumber = rand() * $total;" Me tromperai je ?

J'aurai plutôt fait ça :
Code PHP :
<?php
$tab[0] = 5;
$tab[1] = 10;
$tab[2] = 100;
$tab[3] = 1000;
$tab[4] = 900;

asort($tab);
$total = array_sum($tab);
$rdNumber = mt_rand(0, $total);
$seek = 0;

foreach($tab as $k=>$v) {
    if ($rdNumber <= $seek+= $v) {
        $resultat = $k;
        break;
    }
}
?>


(pas trop testé, ... à voir)


Cordialement,


Kohntark -

vendredi 30 octobre 2009 à 13:14:08 | Re : Tirage au sort avec poids

Arto_8000

Code PHP :
$rdNumber = rand() * $total;


revient au même que ton

Code PHP :
$rdNumber = mt_rand(0, $total);


Pour le reste, l'algorithme est à peu près le même à l'exception que tu utilises plus de fonction native (ce qui est plus performant avec PHP). Ça serait une solution plus performante.
vendredi 30 octobre 2009 à 13:40:12 | Re : Tirage au sort avec poids

Pekka

@Kohntark : ça sert à quoi de trier le tableau?
vendredi 30 octobre 2009 à 19:02:49 | Re : Tirage au sort avec poids

kohntark

Membre Club
Salut,

@Pekka :
Il est nécessaire de trier le tableau dans l'ordre croissant car sinon :

Pour reprendre ton tableau :
$tab[0] = 5;
$tab[1] = 10;
$tab[2] = 100;
$tab[3] = 1000;
$tab[4] = 900;

Le code va tirer un nombre aléatoire entre 0 et la somme de toutes les valeurs du tableau.
Ensuite il parcours chaque élément de ce dernier et regarde si le nombre aléatoire est inférieur au cumul :

Joueur 0 0+5 = 5
Joueur 1 5+10 = 15
Joueur 2 15+100 = 115
Joueur 3 115+1000 = 1115
Joueur 4 1115+900 = 2015

Pour un nombre aléatoire de 2000 c'est le joueur 4 qui va gagner, hors ça devrait être le 3 (on ne compare pas sur une plage mais sur l'éloignement de zéro ($seek))

En ordonnant préalablement le tableau :
Joueur 0 0+5 = 5 (2000 > 5 => perdu)
Joueur 1 5+10 = 15 (2000 > 15 => perdu)
Joueur 2 15+100 = 115 ...
Joueur 4 115+900 = 1015 (2000 > 1015 => perdu)
Joueur 3 1015+1000 = 2015 ((2000 < 2015 => gagné)


@Arto :
rand retourne un nombre pseudo aléatoire entre 0 et la plus grande valeur possible (dépendante du système), non ?

Ainsi :
Code PHP :
<?php
$total = 2015;
$rdNumber = rand() * $total;
// => 47638630
$rdNumber = mt_rand(0, $total);
// => 1670
?>


Cordialement,


Kohntark -



Cette discussion est classée dans : tab, joueur, tirage, sort, poids


Répondre à ce message

Sujets en rapport avec ce message

Tirage au sort [ par adrien334 ] Bonjour Je vien vous poser une petite question car là je trouve rien dutout Savez vous comment je pourais faire pour effectué un tirag au sort ent GROS SOUCI TRES URGENT : Tirage au sort php [ par bastien211 ] Bonjour, je m'appelle Bastien je suis graphiste et j'essaye de faire un tirage au sort en PHP, comme vous l'aurez deviner , vu que je suis graphiste j tirage au sort [ par Marcellinkone ] slt merci de m'aide a ecrire un code qui permait de faire un tirage au sort en fonction des categories ,des types de sports, des dates d'adesions et d Tirage au sort aléatoire pondéré dans une requête SQL [ par Evangun ] Bonjour à tous,je vous soumets une petite colle ! du genre qui fait cogiter, sauf si vous êtes superman.Il s'agit de trouver une requête SQL qui ferai Récupérer la valeur d'un get [ par beegeezzz ] Salut tout le monde, J'essaie en fait de trier mes données de mes tableaux. Pour cela, j'ai changé le nom des champs du tableau en URL : [code]echo '< Le nom des mes colonnes s'effacent [ par beegeezzz ] Bonjour tout le monde,Je trie mes colonnes de mon tableau, tout ce passe bien.J'ai voulu sécuriser le $_GET['Sort'] mais je rencontre quelques difficu Liaison entre deux tables [ par ilyes2002 ] Bonjour à tous, J''espère, trouvera une réponse a mon probleme! J'ai deux tables [b]incsr[/b] et [b]RDV[/b] tout marche bien mais le probleme c'es Probleme avec ma fonction POO [ par korialstraz ] Bonjour à tous, J'ai un petit probleme dont vous trouverez surement la réponse car je débute en php.. Je cherche à afficher un graphique via une fonc Probleme plusieurs tableau lié. [ par shilom54 ] Bonjour a tous, je vais essayer de vous expliquer clairement mon problème : dans mon code j'ai 4 tableaux organisés de la façon suivante : [code=p Enregistrer dans une base de données [ par Sinsitrus ] Salut ! Pouvez-vous m'aider à exécuter ce script svp ? Je n'arrives pas à enregistrer dans ma base de donnée alors que lorsque je clique sur le bouton


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,012 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales