[php/MySQL] Tirage au sort avec pondération


blman
WRInaute accro
WRInaute accro
 
Messages: 3073
Inscription: 5 Sep 2003

Message le Mer Déc 12, 2007 16:56

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.

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.


Leonick
WRInaute accro
WRInaute accro
 
Messages: 18833
Inscription: 8 Aoû 2004

Message le Mer Déc 12, 2007 16:58

blman a écrit:La solution de Moktoipas fonctionne ainsi, si j'ai tout bien compris.
effectivement, je n'avais pas compris sa solution. Elle est bien moins gourmande que la mienne et produit du pseudo aléatoire.


blman
WRInaute accro
WRInaute accro
 
Messages: 3073
Inscription: 5 Sep 2003

Message le Mer Déc 12, 2007 16:59

Ce n'est pas du pseudo aléatoire, c'est carrément de l'aléatoire.


moktoipas
WRInaute passionné
WRInaute passionné
 
Messages: 2326
Inscription: 29 Juin 2004

Message le Mer Déc 12, 2007 16:59

blman ce que veux dire Leonick c'est que j'explique comme un manche :D

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;


HawkEye
WRInaute accro
WRInaute accro
 
Messages: 17005
Inscription: 23 Fév 2004

Message le Mer Déc 12, 2007 16:59

moktoipas a écrit:je pensais que tu voulais faire un jeu de paris en ligne pour les enfants :$ (véridique)


Rhaaa m*****rde... un nouveau projet :mrgreen:


dd32
Modérateur
Modérateur
 
Messages: 3379
Inscription: 9 Sep 2005

Message le Mer Déc 12, 2007 17:09

HawkEye a écrit:
moktoipas a écrit:je pensais que tu voulais faire un jeu de paris en ligne pour les enfants :$ (véridique)


Rhaaa m*****rde... un nouveau projet :mrgreen:

Je vois tout à fait de quoi tu veux parler :mrgreen:


moktoipas
WRInaute passionné
WRInaute passionné
 
Messages: 2326
Inscription: 29 Juin 2004

Message le Mer Déc 12, 2007 17:13

dd32 a écrit:Je vois tout à fait de quoi tu veux parler :mrgreen:


Tu fais des courses de Panda ??


blman
WRInaute accro
WRInaute accro
 
Messages: 3073
Inscription: 5 Sep 2003

Message le Mer Déc 12, 2007 17:14

moktoipas a écrit:
dd32 a écrit:Je vois tout à fait de quoi tu veux parler :mrgreen:


Tu fais des courses de Panda ??


Nan, elle fait les courses en Panda, c'est pas pareil, c'est moins glamour ;)


Leonick
WRInaute accro
WRInaute accro
 
Messages: 18833
Inscription: 8 Aoû 2004

Message le Mer Déc 12, 2007 17:28

HawkEye a écrit:Note: comme certains l'ont compris, il ne s'agit pas de hamsters ou de force, mais bien de comptes AdSense et de "mérite" ;)
l'alternance de code adsense, comme sur WRI ?


HawkEye
WRInaute accro
WRInaute accro
 
Messages: 17005
Inscription: 23 Fév 2004

Message le Mer Déc 12, 2007 17:29

Leonick a écrit:
HawkEye a écrit:Note: comme certains l'ont compris, il ne s'agit pas de hamsters ou de force, mais bien de comptes AdSense et de "mérite" ;)
l'alternance de code adsense, comme sur WRI ?


Oui

ndavoust
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 39
Inscription: 28 Nov 2006

Message le Mer Déc 12, 2007 21:42

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:
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.


moktoipas
WRInaute passionné
WRInaute passionné
 
Messages: 2326
Inscription: 29 Juin 2004

Message le Mer Déc 12, 2007 21:46

c'est la solution que j'ai proposée :)
je l'ai implémenté différemment :)

ndavoust
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 39
Inscription: 28 Nov 2006

Message le Mer Déc 12, 2007 21:47

je viens de l'editer pour montrer ses quelques avantages ;-)


moktoipas
WRInaute passionné
WRInaute passionné
 
Messages: 2326
Inscription: 29 Juin 2004

Message le Mer Déc 12, 2007 21:51

inconvénient, il faut réécrire toute la BDD chaque fois qu'un hamster change de force ou est "hors concours"

et en mysql les écritures sont plus longues que les lecture.

ndavoust
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 39
Inscription: 28 Nov 2006

Message le Mer Déc 12, 2007 22:25

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.

[php/MySQL] Tirage au sort avec pondération [php/MySQL] Tirage au sort avec pondération

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités