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

Langage PHP Discussion :

Tirage au sort mélange sans doublon


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Tirage au sort mélange sans doublon
    Bonjour,

    J'ai créé ce jour un script qui récupère des id d'une table MySQL et qui les mélange (ORDER BY RAND() ou bien rand()) mais pas moyen d'arriver à ce genre de résultat :

    Nom : 6xo7.png
Affichages : 1084
Taille : 12,7 Ko


    Si vous avez une piste en PHP car là je sèche j'ai tout essayé et pourtant je suis sur que c'est simple ! Merci beaucoup

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ids = [1,2,3,4,5,6,7,8,9];
    shuffle($ids);
    $copy = $ids;
    $topElement = array_shift($copy);
    $matchs = [];
    foreach ($ids as $key => $id) {
      if (isset($copy[$key])) {
        $matchs[] = [$id, $copy[$key]];
      } else {
        $matchs[] = [$id, $topElement];
      }
    }
    Probablement pas optimal, des fonctions PHP doivent pouvoir aider a rendre tout ça plus concis/plus clair/plus performant, mais l'idée y est. Le principe c'est de mélanger ton tableau initial puis d'en faire une copie. Tu dépiles ensuite la 1ere valeur de la copie que tu stockes dans une variable, puis tu associes le tableau mélangé avec sa copie (a laquelle il manque le 1er élément donc tout est décalé de 1 vers le haut). Finalement, tu associes la dernière entrée du tableau mélangé avec celle mise de côté et tu as tous tes matchs.

    Il y a possiblement d'autres algorithmes pour arriver a la même chose, je n'en sais rien ça fait parti des choses que j'ai a travailler

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    @Mrsky
    Ton système ne fonctionne pas, puisque tu auras forcément des doublons ("1" joue avec "2" et "2" joue avec "3").

    Par contre, les index pairs peuvent jouer avec les index impairs :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    $ids = [1,2,3,4,5,6,7,8,9];
    shuffle($ids);
     
    var_dump( $ids ) ;
    // nombre de groupes = (nombre de participants / 2) arrondi
    $nbre_groupes = floor( count($ids)/2 );
     
    for ($i=0; $i<$nbre_groupes; $i++)  {
        $matchs[] = [ $ids[$i*2], $ids[$i*2+1] ];
     
    }
     
    var_dump( $matchs ) ;
    ?>
    Remarque : si le nombre de participants est impair, l'un d'eux ne jouera pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    array (size=9)
      0 => int 1
      1 => int 6
      2 => int 8
      3 => int 4
      4 => int 7
      5 => int 2
      6 => int 9
      7 => int 3
      8 => int 5
    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
    array (size=4)
      0 => 
        array (size=2)
          0 => int 1
          1 => int 6
      1 => 
        array (size=2)
          0 => int 8
          1 => int 4
      2 => 
        array (size=2)
          0 => int 7
          1 => int 2
      3 => 
        array (size=2)
          0 => int 9
          1 => int 3
    [EDIT] une variante :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ($i=0; $i<$nbre_groupe; $i++)  {
        $matchs[] = [$ids[$i], $ids[$i+$nbre_groupe]];
    }
    Dernière modification par Invité ; 08/11/2016 à 11h05.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    @Mrsky : Pas mal, mais il manque la gestion du cas "associé à soi-même".

    Plus simple : on mélange et on associe les ids deux par deux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ids = [1,2,3,4,5,6,7,8,9,10];
    shuffle($ids);
    $pairs = array_chunk($ids, 2);
    Au passage, il faudrait peut-être vérifier que le tableau de départ compte un nombre pair d'éléments, sinon tu vas forcément de retrouver avec un id tout seul.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Tu peux faire comme ça. Tu mélange la liste, puis tu associes chaque élément de cette nouvelle liste au précédent. Pour résoudre le problème du premier index de la liste, il suffit de le calculer à part avant la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ids = [1,2,3,4,5,6,7,8,9];
    shuffle($ids);
    $last = count($ids)-1;
    $result = [$ids[0] => $ids[$last]];
    for ($i = $last; $i > 0;) {
        $result[$ids[$i--]] = $ids[$i];
    }
    ksort($result); // pour l'esthétique
    print_r($result);
    Comme ça tu as bien 9 matches sans doublons.

    La même chose sans boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ids = [1,2,3,4,5,6,7,8,9];
    shuffle($ids);
    $result = $ids;
    $result[] = array_shift($result);
    $result = array_combine($ids, $result);
    ksort($result);
    print_r($result);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oubliez ce que je viens de dire, je ne sais pas lire
    Dernière modification par Invité ; 08/11/2016 à 20h10.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    @CosmoKnacki > J'essaie ta solution mais ça semble fonctionner... à moi de l'adapter avec MySQL pour voir si ça fonctionne !

    Merci de vos petites astuces, ça m'aide bien

Discussions similaires

  1. [XL-2013] VBA - tirage au sort aléatoire sans remise
    Par PaulineL dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/12/2019, 10h15
  2. Tirage au sort sans remise
    Par xlink dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/10/2014, 08h15
  3. Plusieurs tirages de couples sans doublons
    Par cedni dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/08/2013, 14h01
  4. Tirage aléatoire sans doublon
    Par Cupidon dans le forum SAS STAT
    Réponses: 2
    Dernier message: 13/02/2013, 11h21
  5. Tirage au sort de bannières sans doublon
    Par cedric.c2ware dans le forum WordPress
    Réponses: 0
    Dernier message: 22/04/2011, 18h46

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