Tirage aléatoire Mysql

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tirage aléatoire Mysql

par Arno76 » 22 juil. 2009, 01:01

Merci a vous :D :wink:

par dunbar » 20 juil. 2009, 01:33

J'avais jadis
:-$ :langue:

par albat » 20 juil. 2009, 01:20

J'avais jadis codé un outil de ce type.
Dans un autre langage.

Je lançais un randomize() et je multipliais la résultat par 100.
J'obtenais donc une valeur comprise entre 0 et 100.

NB : En PHP, il suffit de faire un rand(0,100) :pouce:

Ensuite, je confrontais cette valeur à une grille de pourcentages.

En reprenant l'exemple de zeus, ça donnerait :

Code : Tout sélectionner

+---------+-------------+ | valeur | pondération | +---------+-------------+ | valeur1 | 20% | | valeur2 | 30% | | valeur3 | 50% | +---------+-------------+
if ($tirage<20) echo "valeur 1"; // donc entre 0 et 19
   else
   if ($tirage<50) echo "valeur 2"; // donc entre 20 et 49
      else
      echo "valeur 3";
Tout bêtement... ;)

par zeus » 20 juil. 2009, 01:05

Bonjour,

La méthodologie pour pondérer une probabilité (c'est à dire fixer un pourcentage de sortie), c'est de faire apparaitre plusieurs fois chaque résultat, en fonction de la pondération.
Par exemple, voici un jeu de résultat, avec une pondération :

Code : Tout sélectionner

+---------+-------------+ | valeur | pondération | +---------+-------------+ | valeur1 | 20% | | valeur2 | 30% | | valeur3 | 50% | +---------+-------------+
Si tu fais une requête simple de choix aléatoire, telle que la suivante :

Code : Tout sélectionner

SELECT * FROM laTable ORDER BY RAND() LIMIT 1
Dans ce cas, il y a 1 chance sur 3 pour chaque valeur qu'elle sorte. Ceci parce qu'il y a 3 valeurs dans le résultat du SELECT, et le ORDER BY RAND() choisie aléatoirement une valeur du résultat.

Pour pondérer le résultat, il faut que tu dupliques les valeurs dans le résultat, avant d'appliquer la sélection aléatoire.
Je m'explique : dans le jeu de test que je t'ai donné ci-dessus, je veux que la valeur1 n'ait que 20% de chance de sortir. Il faut donc que je me débrouille pour qu'elle représente 20% des résultats dans lequel la sélection aléatoire va se faire.
Pour cela, il faut que je fasse apparaitre 2 fois dans le jeu de résultat, qui devra contenir 10 lignes.

Pour la valeur2, en suivant la même logique, il faut qu'elle apparaisse 3 fois, et pour la valeur3, 5 fois.

Au final, je vais obtenir un jeu de possibilité semblable à ça :

Code : Tout sélectionner

valeur1 valeur1 valeur2 valeur2 valeur2 valeur3 valeur3 valeur3 valeur3 valeur3
Maintenant, sur ce résultat, je peux appliquer une sélection aléatoire standard, et je sais que j'ai appliqué une pondération aux votes puisque qu'il n'y a que 20% (2 chances sur 10) que la valeur1 soit choisie.

J'ai pour habitude de faire ce genre de traitement en PHP, parce que je trouve que la solution tout SQL est assez lourde pour le SGBD.

Voici ce que je ferais :
<?php

/**
 *	Basé sur le schéma suivant :
 *
 *	CREATE TABLE `phpfrance`.`valeurs` (
 *	`id_valeur` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
 *	`nom` VARCHAR( 255 ) NOT NULL ,
 *	`ponderation` INT NOT NULL ,
 *	PRIMARY KEY ( `id_valeur` ) 
 *	) ENGINE = InnoDB
 */

// Exemple de connexion à une base MySQL
$dbh = new PDO('mysql:host=localhost;dbname=phpfrance', 'root', 'password');

$str_requete = 'SELECT nom, ponderation FROM valeurs';

$a_results = array();
// On parcours la liste des résultats
foreach( $dbh->query($str_requete) as $a_valeur )
{
	// On ajoute autant de fois la valeur que la pondération l'indique
	for($i = 0; $i < $a_valeur['ponderation']; $i++)
		$a_results[] = $a_valeur['nom'];
}

// Et maintenant, on récupére une valeur aléatoirement dans ce tableau
$gagnant = $a_results[array_rand($a_results)];

echo "Et le gagnant est '".$gagnant."'";

par Arno76 » 20 juil. 2009, 00:57

c est pour un système de bannière avec ratio défini par le membre.

par albat » 20 juil. 2009, 00:49

T'as jamais joué à la roulette, toi ! :-*

par dunbar » 20 juil. 2009, 00:09

Salut,

Faire un tirage aléatoire avec un ratio défini pour que certain sorte plus que d'autre (définie par le ratio).

Merci :D
C'est encore aléatoire si tu fausse le resultat :?: :wink:

par Arno76 » 17 juil. 2009, 22:16

Salut,

Faire un tirage aléatoire avec un ratio défini pour que certain sorte plus que d'autre (définie par le ratio).

Merci :D

par orgerix » 17 juil. 2009, 21:53

C'est à dire ? Que la probabilité de sortie dépende du champ ?

Tirage aléatoire Mysql

par Arno76 » 17 juil. 2009, 20:20

Bonjour,

Je souhaiterai savoir comment effectué un tirage aléatoire Mysql ca c'est bon mes je voudrais le faire par rapport à un pourcentage défini dans la basse de données ?

J'espère avoir été claire merci pour votre aide :wink: