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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Tirage de nombres différents


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 20
    Par défaut Tirage de nombres différents
    Bonjour à tous ! Je suis bloqué dans un TP PHP, en effet, je dois faire un tableau LOTO avec des nombres aléatoires. Cependant je dois rajouter un moyen de vérifier si les nombres du tableau sont tous différents. C'est ici que je bloque je ne trouve pas le moyen de faire une fonction ou autre dans mon code pour vérifier.
    Voici mon code :

    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
    46
    47
    48
    49
    50
    51
     
    <!DOCTYPE html>
     
    <html>
     
    	<head>
    		<title>Loto</title>
    		<meta charset="utf-8">
    	</head>
     
    	<body>
     
    		<center>
     
    			<table border="1">
     
    				<tr>
     
    					<td>Case 1</td>
    					<td>Case 2</td>
    					<td>Case 3</td>
    					<td>Case 4</td>
    					<td>Case 5</td>
    					<td>Case 6</td>
    					<td>Case 7</td>
     
    				</tr>
     
    				<tr>
     
    <?php
     
    $tableau = array(1, 2, 3, 4, 5, 6, 7);
     
    for ($i=0; $i <= 6; $i++)
    { 
    	$random = rand(1,49);
    	echo "<td>$tableau[$i] = " . $random . "</td>";
    }
     
    ?>
     
    				</tr>
     
    			</table>
     
    		</center>
     
    	</body>
     
    </html>
    Merci beaucoup !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Il suffit de mettre tes tirages dans un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $range = array(1, 7);
    $n = 6;
     
    $result = array();
    while (count($result) < $n) {
       $random = rand(1, 49);
       if (!in_array($random, $result)) {
           $result[]= $random;
       }
    }
     
    print_r($result);
    en amélioration on vérifiera s'il y a plus de nombres possibles que de nombres demandés, sinon le code tournera à l'infini.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 20
    Par défaut
    Il semblerait que j'ai une erreur avec ton point d'exclamation dans la boucle "if". Peut-être qu'il est mal placé

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Il suffit de bien le placer alors.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

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

    Une autre approche :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    // numéros de 1 à 49
    $loto = array();
    for($i=1; $i<50; $i++)
    {
    	$loto[] = $i;
    }
    	shuffle($loto); // mélange
    	shuffle($loto); // mélange
     
    // Tirage (6 numéros) + Numéro complémentaire
    $tirage = array();
    $num = 0;
    while( $num<6 )
    {
    	shuffle($loto); // mélange
    	$tirage[] = $loto[0]; // on prend le 1er
    	unset($loto[0]); // on supprime le 1er
    	$num++;
    }
    	shuffle($loto);
    	$complementaire = $loto[0];
    // Affichage
    echo '<p>Tirage du loto : '.implode(', ',$tirage).'</p>';
    echo '<p>Numéro complémentaire : '.$complementaire.'</p>';
    ?>
    Puisqu'à chaque tirage on supprime le numéro de l'array $loto, plus de risque d'avoir 2 fois le même numéro.
    Dernière modification par Invité ; 07/04/2018 à 09h22.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    quand tu maîtriseras PHP, cela prendra 3 lignes :
    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
    <?php
    $nums = range(1, 49);
    shuffle($nums);
    $head   = array_map(function($p) { return "<th>Case {$p}</th>"; }, range(1, 7));
    $tirage = array_map(function($p) { return "<td>{$p}</td>"; }, array_slice($nums, 0, 7));
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Loto</title>
    <meta charset="utf-8">
    </head>
    <body>
    <table border="1">
        <thead>
            <tr><?= implode('', $head) ?></tr>
        </thead>
        <tbody>
            <tr><?= implode('', $tirage) ?></tr>
        </tbody>
    </table>
    </body>
    </html>

  7. #7
    Invité
    Invité(e)
    Par défaut
    Lol... En effet.

    1- Pour ma part, j'ai eu une approche plus "concrète" et "réaliste" :
    • On remplit le panier (avec des boules de 1à 49)
    • On mélange (avant chaque tirage)
    • On tire une boule (1 à la fois)
    • ... (On répète 6 fois)
    • Enfin, on tire le numéro complémentaire

    C'est plus... ludique !

    2- J'aurais pu, aussi, faire plus court.
    Si on suppose qu'on fait UN SEUL mélange, et qu'on tire TOUTES les boules d'un coup, mon code devient :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    // numéros de 1 à 49
    $loto = range(1,49);
    shuffle($loto); // un seul mélange
     
    // Tirage (6 numéros) + Numéro complémentaire
    $complementaire = $loto[0]; // on prend le 1er
    $tirage = array_slice($loto, 1, 6); // on coupe les 6 suivants
     
    // Affichage
    echo '<p>Tirage du loto : '.implode(', ',$tirage).'</p>';
    echo '<p>Numéro complémentaire : '.$complementaire.'</p>';
    ?>
    ... et le tour est joué ! (mais ça perd un peu de son charme...)


    3- Quelques liens (pour l'aspect "pédagogique" ) :



    4- @rawsrc : ton code prend PLUs de 3 lignes !
    ...Je suis bloqué dans un TP PHP...
    Si il colle ton code dans son TP, je doute que le prof pense qu'il l'a pondu lui-même !
    Dernière modification par Invité ; 07/04/2018 à 09h24.

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    ...quand tu maîtriseras PHP, cela prendra 3 lignes : ...
    Et du coup le code devient beaucoup plus difficile à lire que des solutions plus longues
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    4- @rawsrc : ton code prend PLUs de 3 lignes !

    ben ouais, je code mais j'ai du mal à compter jusqu'à 4 !! c'est dire

  10. #10
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $nums = range(1, 49);
    shuffle($nums);
    $head   = array_map(function($p) { return "<th>Case {$p}</th>"; }, range(1, 7));
    $tirage = array_map(function($p) { return "<td>{$p}</td>"; }, array_slice($nums, 0, 7));
    Je pense être efficiente en PHP, mais là, il me faudrait plus d'une heure pour assimiler les lignes 3 ou 4...
    C'est le genre de code très ramassé que j'admire certes, mais que je pense difficile à maintenir si l'on n'est pas dans les 2% des développeurs les plus musclés du bulbe.
    Un code élitiste en somme. Et vous connaissez les valeurs de l'entreprise : il faut être efficient, surtout pas perfectionniste.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ce n'est pas dur à comprendre en fait : le array_map remplace le foreach.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tirage = array_map(function($p) { return "<td>{$p}</td>"; }, array_slice($nums, 0, 7));
    <=>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach (array_slice($nums, 0, 7) as $value) { $tirage[] = "<td>$value</td>"; };
    La ligne foreach est même plus courte.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Un code élitiste en somme.
    Non, mon code n'est pas élitiste comme l'explique sabotage.
    Si j'avais voulu me la jouer "musclé du bulbe", je te l'aurais donné en une seule ligne (tu as tout : la génération des nombres, tirage (pseudo)aléatoire et formatage html) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $tirage = implode('', array_map(function($p) { return '<td>'.++$p.'</td>'; }, array_rand(range(1, 49), 7)));
    // ou
    $tirage = '<td>'.implode('</td><td>', array_rand(array_fill_keys(range(1, 49), 0), 7)).'</td>';
    Là, je comprendrais si tu me dis que c'est un poil plus pêchu

    Les fonctions tableaux en PHP c'est quand même très fort.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Trop fort !

    ...Si j'avais voulu me la jouer "musclé du bulbe", ...
    Ne t'étonne pas après si on t'appelle "tête d'ampoule" !

Discussions similaires

  1. [VxiR2] Numéro de ligne dans un tableau
    Par pnoel-bi dans le forum Deski
    Réponses: 1
    Dernier message: 09/05/2016, 05h13
  2. [Débutant] Récupérer le numéro du rang d'un élément dans un tableau
    Par PapouMAC dans le forum VB.NET
    Réponses: 4
    Dernier message: 03/01/2016, 21h20
  3. Réponses: 2
    Dernier message: 07/09/2010, 12h39
  4. [WD-2003] Champ Numéro de page dans un tableau
    Par cire190 dans le forum VBA Word
    Réponses: 3
    Dernier message: 06/05/2010, 19h59
  5. Mettre numéros dans tableau
    Par GarsDuCalvados dans le forum Langage SQL
    Réponses: 13
    Dernier message: 22/05/2009, 15h06

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