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

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


blman
WRInaute accro
WRInaute accro
 
Messages: 2915
Inscription: Ven Sep 05, 2003 10:46

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: 12390
Inscription: Dim Aoû 08, 2004 20:24

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: 2915
Inscription: Ven Sep 05, 2003 10:46

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 accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

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
Modérateur
Modérateur
 
Messages: 15043
Inscription: Lun Fév 23, 2004 12:33

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: 3262
Inscription: Ven Sep 09, 2005 10:21

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 accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

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: 2915
Inscription: Ven Sep 05, 2003 10:46

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: 12390
Inscription: Dim Aoû 08, 2004 20:24

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
Modérateur
Modérateur
 
Messages: 15043
Inscription: Lun Fév 23, 2004 12:33

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
 
Messages: 39
Inscription: Mar Nov 28, 2006 21:14

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 accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

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
 
Messages: 39
Inscription: Mar Nov 28, 2006 21:14

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

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


moktoipas
WRInaute accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

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
 
Messages: 39
Inscription: Mar Nov 28, 2006 21:14

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

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

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