IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Selection aléatoire avec rand


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 20
    Points
    20
    Par défaut Selection aléatoire avec rand
    Bonjour je cherche à selectionner dans ma base les gagnants pour un jeu.

    voila la requete qu j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from KADO where Tirage =200511 and Kado =2 and Mise > 0 order by Mise desc ;
    je voudrais selectionner 1 joueur aleatoirement mais en sachant ke plus il a misé plus a de chance de gagner.

    je m'interroge sur l'utilisation de rand.

    je pense ke je dois peu etre utiliser une table temporaire mais je ne vois pas comment faire. si quelqun peut m'aider ?

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: Selection aléatoire avec rand
    Citation Envoyé par Ruddy16
    je voudrais selectionner 1 joueur aleatoirement
    Ca, c'est banal comme problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORDER BY RAND() DESC
    LIMIT 1

    Citation Envoyé par Ruddy16
    mais en sachant ke plus il a misé plus a de chance de gagner.
    Là, c'est plus dur. Afin de rester simple, je pense à un truc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM KADO
    WHERE Tirage=200511 AND Kado =2
    AND Mise > 0
     
    ORDER BY RAND() / Mise
    LIMIT 1 ;
    Ici on a 0 < 1/Mise (car 0<Mise) et plus la mise est élévée, plus 1/Mise est petit (donc on fait un ORDER BY ascendant). Logiquement, 0 <= RAND()/Mise < 1.

    En procédant ainsi, on devrait donc avoir:
    - un tirage automatique simple (1 seule requête)
    - plus tu mises, plus tu as de chances de gagner

    Cependant, je m'interroge sur la distribution des chances de tirage, qui n'est peut-être pas équitablement repartie.

    Pour avoir une répartition équitable, il faudrait en effet faire une table temporaire, avec un cumul des sommes misées, tirer un nombre aléatoire entre 0 et le cumul total des mise avant de sélectionner le joueur dont le cumul est le plus proche de la valeur tirée (sans dépasser). Bref, c'est pas simple ! (et demande pas mal de programmation)

    Voilà.

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    A la réflexion, l'utilisation d'une formule pour le tirage est une fausse bonne idée (j'ai trouvé plusieurs cas pour lesquels ça ne marchait pas).

    Il faut donc passer par l'usage d'une table temporaire avec cumul des mises (comme exposé précédemment).

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Une solution 100% MySQL (non testée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    # Nettoyage (par sécurité)
    DROP TABLE IF EXISTS kado_rand ;
     
     
    #Creation table temporaire
     
    CREATE TABLE kado_rand (
      ...  #Champs de kado
     
      cumul INT
    ) ;
     
     
     
    # Insertion avec cumuls
     
    INSERT INTO kado_rand
     
    SELECT A.*, SUM(B.Mise) AS cumul
    FROM kado A
    INNER JOIN kado B ON (B.id <= A.id)
     
    WHERE A.Tirage=200511 AND A.Kado=2 AND A.Mise > 0
    AND B.Tirage=200511 AND B.Kado=2 AND B.Mise > 0
    GROUP BY A.id ;
     
     
    # On relève le cumul total
    SELECT @cumulTotal:=MAX(cumul)
    FROM kado_rand ;
     
     
    # Tirage aléatoire
    SELECT @cumulGagnant:=FLOOR(RAND() * @cumulTotal) ;
     
     
    # Selection du gagnant
    SELECT *
    FROM kado_rand
    WHERE cumul<=@cumulGagnant
    ORDER BY cumul DESC
    LIMIT 1 ;
     
    # Nettoyage après exécution
    DROP TABLE IF EXISTS kado_rand ;
    L'insertion avec cumul n'est pas optimale (complexité O(n^2) ), sinon il faut faire le cumul manuellement avec du PHP.

    Je n'ai pas testé ce script, mais ça te donnera une idée de ce qu'il faut faire.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    Merci Bcp.

    je vais tester tout ca. je te tiens au courant.

    En tout cas merci de tes solutions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/03/2014, 15h27
  2. l'aléatoire avec rand()
    Par kochfet dans le forum C++
    Réponses: 9
    Dernier message: 18/11/2013, 14h18
  3. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 04h04
  4. [Valeur aléatoire] Problème avec rand()
    Par Machjaghjolu dans le forum C++
    Réponses: 4
    Dernier message: 06/12/2005, 18h10
  5. SELECT avec RAND() mais plus avancé
    Par Sebou San dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/11/2005, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo