[php/MySQL] Tirage au sort avec pondération
40 messages
• Page 2 sur 3 • 1, 2, 3
-

blman - WRInaute accro

- Messages: 3073
- Inscription: 5 Sep 2003
Et oui, Jean est même un gros hamster
Plus sérieusement, oui, effectivement il n'y a pas besoin de faire le shuffle, donc en fait, c'est super simple à mettre en place.
La règle représente la somme des forces
Le joueur 4 a plus de chance d'être tiré que les joueurs 1,6,7 ou 8
Si on tire un nombre aléatoire, l'utilisateur qui a l'interval le plus grand (celui qui a le plus de force) a logiquement, plus de chance d'être sélectionné.
Plus sérieusement, oui, effectivement il n'y a pas besoin de faire le shuffle, donc en fait, c'est super simple à mettre en place.
- Code: Tout sélectionner
-1-|-----2-----|---3---|------------4----------------|------5--------|-6-|-7-|-8-|
La règle représente la somme des forces
Le joueur 4 a plus de chance d'être tiré que les joueurs 1,6,7 ou 8
Si on tire un nombre aléatoire, l'utilisateur qui a l'interval le plus grand (celui qui a le plus de force) a logiquement, plus de chance d'être sélectionné.
Dernière édition par blman le Mer Déc 12, 2007 16:58, édité 1 fois.
-

moktoipas - WRInaute passionné

- Messages: 2326
- Inscription: 29 Juin 2004
blman ce que veux dire Leonick c'est que j'explique comme un manche
A cas ou certain le voudrais, voici le code:
A cas ou certain le voudrais, voici le code:
- Code: Tout sélectionner
$query = mysql_query("SELECT SUM(force) FROM `hamsters` WHERE `valide` = 1");
$lignederesultat=mysql_fetch_array($query);
$forcetotaledeshamster=$lignederesultat[0];
$monrandom=rand (0,$forcetotaledeshamster); //attention fonction un peu limitée sous windows ( elle peut pas faire plus que 32768 ). Mais il existe plein d'autre
$query = mysql_query("SELECT `hamster_name`, `force` FROM `hamsters` WHERE `valide`= 1");
$jaitrouvemongagnant=false;
//tant quej 'ai pas trouvé mon gagnant et que mon tableau sql est pas fini
while (!($jaipasencoretrouvemongagnant) && $ligendehamster=mysql_fetch_array($query))
{
$monrandom-=$ligendehamster['force'];//je fait ma soustraction
if ($monrandom<=0) //quand je deviens négatif ou nul
{
$jaitrouvemongagnant=true;//c'est qu ej'ai mon gagnant
$gagnant=$ligendehamster['hamster_name'];
}
}
echo $gagnant;
- ndavoust
- Nouveau WRInaute

- Messages: 39
- Inscription: 28 Nov 2006
ok c'est tout simple :
tu as un tableau avec tes hamsters et tes poids :
hamster1 2
hamster2 3
hamster3 0 (elimine)
hamster4 1
hamster5 7
tu rajoute une troisième colonne avec la somme des poids précédents plus le poids du hamster:
hamster1 2 2
hamster2 3 5 (=2+3)
hamster3 0 5 (=2+3+0)
hamster4 1 6 (=2+3+0+1)
hamster5 7 13 (=2+3+0+1+7)
tu tire au hasard entre 1 et 13 (compris) => $rand
Ca te demande un autre champs dans ta table, mais ensuite le tirage au sort est hyper facile en sql:
un truc du style:
Je l'utilise pour tirer des bannières pub au sort avec des poids différents
L'avantage, c'est que la reponse de la bdd ne fait qu'une ligne (donc hyper rapide), il n'y a pas de traitement par derriere (parcours de tableau...)

tu as un tableau avec tes hamsters et tes poids :
hamster1 2
hamster2 3
hamster3 0 (elimine)
hamster4 1
hamster5 7
tu rajoute une troisième colonne avec la somme des poids précédents plus le poids du hamster:
hamster1 2 2
hamster2 3 5 (=2+3)
hamster3 0 5 (=2+3+0)
hamster4 1 6 (=2+3+0+1)
hamster5 7 13 (=2+3+0+1+7)
tu tire au hasard entre 1 et 13 (compris) => $rand
Ca te demande un autre champs dans ta table, mais ensuite le tirage au sort est hyper facile en sql:
un truc du style:
- Code: Tout sélectionner
select hamster_nom
from hamsters
where sommepoids>$rang
AND poids<>0
order by poids desc
limit 1
Je l'utilise pour tirer des bannières pub au sort avec des poids différents
L'avantage, c'est que la reponse de la bdd ne fait qu'une ligne (donc hyper rapide), il n'y a pas de traitement par derriere (parcours de tableau...)
Dernière édition par ndavoust le Mer Déc 12, 2007 21:49, édité 2 fois.
- ndavoust
- Nouveau WRInaute

- Messages: 39
- Inscription: 28 Nov 2006
vrai, tout cela dépend des utilisations... en ce qui concerne les bannières de pub, je change pas les poids souvent donc bon.
ceci dit, pour rester dans le cas du hamster, vu que tu perd ton tableau a chaque chargement de page pour le recréer, et que tout changement de poids te fait aussi recharger une page et réinscrire ta base, je pense qu'on est dans le kif kif.
Dans le cas ou on a une lecture par ecriture (cas d'un joueur unique faisant monter et descendre le poids de son hamster), ta solution est meilleure.
Dans le cas ou nb lectures >> nb ecritures (cas de beaucoup de tirages au sort pour pas beaucoup de changement de poids respectifs), ma solution l'emporte.
ceci dit, pour rester dans le cas du hamster, vu que tu perd ton tableau a chaque chargement de page pour le recréer, et que tout changement de poids te fait aussi recharger une page et réinscrire ta base, je pense qu'on est dans le kif kif.
Dans le cas ou on a une lecture par ecriture (cas d'un joueur unique faisant monter et descendre le poids de son hamster), ta solution est meilleure.
Dans le cas ou nb lectures >> nb ecritures (cas de beaucoup de tirages au sort pour pas beaucoup de changement de poids respectifs), ma solution l'emporte.
40 messages
• Page 2 sur 3 • 1, 2, 3
Lectures recommandées sur ce thème :
- Tirage au sort et poids du résultat
- tirage au sort dans un tableau sur plusieurs niveaux
- Réglement pour concours SANS tirage au sort, obligatoire ?
- [MySQL] tirage aléatoire via ORDER BY rand()
- Tirage aléatoire dans une table MySQL (solutions et questions)
- question php - fonction sort()
- [PHP-MySQL] : argument is not a valid MySQL ressource
- Ponderation NOEMBED vs Texte visible
- Pondération des mots du nom de domaine
- Y a t-il une pondération sur des mots ?
- Référencement : le problème des sessions des pages PHP - 04-08-2008
- Gestion des langues et des sessions en PHP / MySQL - 02-05-2004
- Passage à l'heure d'été/hiver sur un forum phpBB - 31-10-2010
- WebRankInfo lance la publicité collaborative - 15-10-2004
- Script de mise en cache des pages (PHP MySQL) - 09-08-2010
- GoogleStats : analyse temps réel des visites de Google sur votre site - 02-10-2002
- Google sort la version française de Blogger - 15-11-2004
- Google sort l'API AdWords Sandbox - 09-08-2006
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités



