|
Voir le sujet précédent :: Voir le sujet suivant
|
| Auteur |
Message |
| |
|
HawkEye Modérateur

Inscrit le: 23 Fév 2004 Messages: 12124 Localisation: Google
|
Posté le : Mer Déc 12, 2007 11:07 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
Hello,
Je cherche à faire un tirage au sort, avec une condition et une pondération basée sur un score.
Exemple: Choisir un hamster gagnant parmi ceux qui ne sont pas éliminés, et en les favorisant proportionnellement à leur force.
Les données seraient organisées comme suit:
[ nom_joueur | nom_hamster | valide | force ]
--> (jean, ham_star, 1, 500)
--> (paul, hemmster, 1, 1000)
--> (marc, lobster, 0, 1800)
--> le hamster de marc ne peut pas gagner (il est éliminé)
--> le hamster de paul a 2x plus de chances d'être tiré au sort...
Je ne trouve pas de solution simple  |
|
| |
|
 |
oli004 WRInaute accro

Inscrit le: 06 Jan 2005 Messages: 1856 Localisation: France, departement 03 (Allier)
|
Posté le : Mer Déc 12, 2007 11:23 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
ça ne fonctionne pas ça :
soit x la plus grande force
if rand(1,x) < y {
y gagne ;
}
else {
x gagne ;
}
?
bien sur, préalablement, tu fais un select sur ta base de deux id aléatoire dont eliminé est à 0
Dernière édition par oli004 le Mer Déc 12, 2007 11:27; édité 1 fois |
|
| |
|
 |
moktoipas WRInaute accro

Inscrit le: 29 Juin 2004 Messages: 1827 Localisation: Nantes
|
Posté le : Mer Déc 12, 2007 11:23 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
Moi je le ferai en duex requettes
1 pour recureper la liste des hamster dansl a courses
1 pour recuperer la somme des forces des hamster dans la course.
la seconde renvoie 1500 donc
et tu choisi un nombre au pif entre 0 et 1500
ensuite, tu parcours (dans n'importe quel ordre, osef) le resultat de la requete des hamster qui sont dans la course.
a chaque hamster( enfin) ligne) tu soustrait de ton random la force du hamster.
Quand juste après ta soustraction tu a ton random qui fait 0 ou est négatif, c'est que tu est tombé sur le hamster gagnant
(moi je prefere les gerbilles) |
|
| |
|
 |
Leonick WRInaute accro

Inscrit le: 08 Aoû 2004 Messages: 8427 Localisation: Val de Marne
|
Posté le : Mer Déc 12, 2007 11:41 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
| perso, je ferais un array() qui contiendrait 500 fois jean et 1000 foi paul, un petit shuffle () et tu prends le 1° du tableau |
|
| |
|
 |
HawkEye Modérateur

Inscrit le: 23 Fév 2004 Messages: 12124 Localisation: Google
|
Posté le : Mer Déc 12, 2007 11:42 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
oli004, j'aurais du préciser qu'il peut y avoir 100 hamsters dans la course... pas obligatoirement 2
moktoipas, ton idée m'a l'air bien. Aucun souci pour les deux requêtes, mais c'est la suite qui va me poser problème...
Je t'envoie un petit MP pour la partie "php"
Merci |
|
| |
|
 |
blman WRInaute accro

Inscrit le: 05 Sep 2003 Messages: 2697 Localisation: Nantes / Laval (France)
|
Posté le : Mer Déc 12, 2007 12:03 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
Moi je ferais pareil que Leonick si tu n'a pas trop d'enregistrement et pareil que moktoipas si tu en a beaucoup
PS : HawkEye, laisse Moktoipas tranquille, il a déjà assez de boulot comme ça  |
|
| |
|
 |
auboutdufil Nouveau WRInaute
Inscrit le: 19 Mai 2006 Messages: 21 Localisation: France
|
Posté le : Mer Déc 12, 2007 13:08 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
Moi je pondèrerai sur une échelle de 1 à 10 les forces :
--> (jean, ham_star, 1, 500, 0)
--> (paul, hemmster, 1, 1000, 1)
--> (marc, lobster, 0, 1800, 2)
Ensuite je fais un tableau pondéré :
(lobster, lobster, hemmster)
[note: il n'y a pas ham_star car il a une note de 0, et il y a 2 fois lobster parce qu'il a une note de 2)
et je fais un joli random dessu  |
|
| |
|
 |
athoms WRInaute occasionnel

Inscrit le: 22 Avr 2004 Messages: 223 Localisation: France
|
Posté le : Mer Déc 12, 2007 16:52 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
Salut?
Et en sql ça ne serait pas possible de faire ça, avec quelque chose du genre?
| Code: |
| select * from hamster where valide=1 order by rand(),force desc limit 1 |
|
|
| |
|
 |
Leonick WRInaute accro

Inscrit le: 08 Aoû 2004 Messages: 8427 Localisation: Val de Marne
|
Posté le : Mer Déc 12, 2007 17:05 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
| non, je crois que la seule solution semble être celle que j'ai donnée. Si on effectue un tri selon un 2° critère (genre la force), que j'ai force 2 ou 2000, je serais juste devant celui qui a une force 1 et j'aurais toujours 1 chance sur 2 d'être tiré au sort. |
|
| |
|
 |
moktoipas WRInaute accro

Inscrit le: 29 Juin 2004 Messages: 1827 Localisation: Nantes
|
Posté le : Mer Déc 12, 2007 17:10 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
Non, ta solution n'est pas la seule ^^
La mienne est tout a fait valable et évite de faire un tri sur un tableau de millions d'entrées (1000 hamster de force 1000 et on se retrouve avec un méga tableau). |
|
| |
|
 |
rog WRInaute accro

Inscrit le: 21 Sep 2006 Messages: 1662 Localisation: sapucaia do sul (RS)
|
Posté le : Mer Déc 12, 2007 17:43 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
j'ai l'impression qu'aucune des deux solutions ne convient
ça marche pas avec un tableau de 3
lol
1 - 500
2 - 1000
3 - 2000
= 3500
si on divise par 500, on obient 7
sur 7 affichages on devrait avoir
une fois le 1
deux fois le 2
quatre fois le 3
à moins trouver une fonction mysql qui correspond à cet algo, ça va être un peu plus compliqué à mettre en place que cela ne le paraît
rog |
|
| |
|
 |
blman WRInaute accro

Inscrit le: 05 Sep 2003 Messages: 2697 Localisation: Nantes / Laval (France)
|
Posté le : Mer Déc 12, 2007 17:45 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
La solution de Moktoipas fonctionne ainsi, si j'ai tout bien compris.
Ma table :
Tibo -> force 500
Cyril -> force 1000
Yves -> force 100
Jean -> force 2000 (balaise Jean)
Bruno -> force 500
Total des forces : 4100
Test 1 :
-------------------------------------------------------
Nbre prix au pif dans l'interval 0-4100 -> allé au hasard 4000 (voir http://fr3.php.net/rand)
Ensuite, on mélange le tableau des hamsters pour faire un tri aléatoire ( http://fr.php.net/shuffle )
Jean -> 4000 - 2000 = 2000 -> perdu
Cyril -> 2000 - 1000 = 1000 -> perdu
Tibo -> 1000 - 500 = 500 -> perdu
Bruno -> 500 - 500 = 0 -> gagné !!!
Test 2 :
-------------------------------------------------------
Nbre prix au pif dans l'interval 0-4100 -> allé au hasard 2000
Ensuite, on mélange le tableau des hamsters pour faire un tri aléatoire ( http://fr.php.net/shuffle )
Bruno -> 2000 - 500 = 1500 -> perdu
Tibo -> 1500 - 500 = 1000 -> perdu
Jean -> 1000 - 2000 = -1000 -> gagné !!!
Et oui, effectivement, avec cette solution, on consomme moins de ressources sur un nombre important d'enregistrements que de multiplier le nombre d'entrées d'un tableau. Et plus on a de force, plus on a de chance de gagner. |
|
| |
|
 |
HawkEye Modérateur

Inscrit le: 23 Fév 2004 Messages: 12124 Localisation: Google
|
Posté le : Mer Déc 12, 2007 17:47 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
| moktoipas a écrit: |
Non, ta solution n'est pas la seule ^^
La mienne est tout a fait valable et évite de faire un tri sur un tableau de millions d'entrées (1000 hamster de force 1000 et on se retrouve avec un méga tableau). |
C'est aussi la crainte que j'avais
Disons qu'il n'y a qu'une dizaine de hamsters pour l'instant, et que leur force va de 50 à 6500... mais ces deux valeurs sont haussières
J'ai appliqué la solution de moktoipas (désolé blman, j'te l'ai pris quelques minutes ). Merci à tous.
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"  |
|
| |
|
 |
moktoipas WRInaute accro

Inscrit le: 29 Juin 2004 Messages: 1827 Localisation: Nantes
|
Posté le : Mer Déc 12, 2007 17:52 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
c'est meme pas la peine de faire un shuffle.
meme bruno, qui est a la fin du tableau a des chance de gagner, il gagnera quand le random sera entre 3600 et 4100.
sa proba est donc de (4100-3600)/4100= 500/4100
en fait c marche peu importe l'ordre des hamster (jean est un hamster ) |
|
| |
|
 |
moktoipas WRInaute accro

Inscrit le: 29 Juin 2004 Messages: 1827 Localisation: Nantes
|
Posté le : Mer Déc 12, 2007 17:53 Sujet du message: [php/MySQL] Tirage au sort avec pondération |
|
|
| Citation: |
| 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" |
moi j'avais pas compris
je pensais que tu voulais faire un jeu de paris en ligne pour les enfants :$ (véridique) |
|
| |
|
 |
| |
|
|