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

C# Discussion :

Insertion nombre aléatoires mais uniques dans 1 tableau [Débutant]


Sujet :

C#

  1. #1
    Membre averti
    Femme Profil pro
    Informaticienne
    Inscrit en
    Mai 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Informaticienne
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 34
    Par défaut Insertion nombre aléatoires mais uniques dans 1 tableau
    Bonsoir à toutes et tous,

    Cela fait quelques jours que j'essaie d'apprendre le C#,
    Après avoir planché tout l'après midi sur un TP ou l'on me demande de créer un tirage de loto (et oui, je sais ce n'est pas gagné mais je persiste!!!), voici le code que j'ai écrit :

    Code C# : 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
    public static void Main(string[] args)
    {
    AfficherResultatloto();
    }
    public static void AfficherResultatloto ()
    {
    Console.WriteLine();
     
    int[] nbLoto = newint[7];
     
    Random nbAleatoire = newRandom();
     
    Console.WriteLine("Le Résultat du tirage du Loto est : ");
     
    for (int i = 0; i < 7; i++)
    {
    nbLoto[i] = nbAleatoire.Next(0, 49);
     
    /* if (!nbLoto.Contains<>(nbAleatoire))
     
    {
     
    nbLoto[i] = nbAleatoire;
     
    i++;
     
    }*/
     
    Console.WriteLine("\n{0, 7}", nbLoto[i]);
     
    Console.WriteLine();
     
    }
     
    }
    En fait je n'arrive pas à faire en sorte qu'il ne répète pas 2 fois le même numéro....

    Help me please!!!!!!

    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 257
    Par défaut
    Fjsinfo,

    Tu peux utiliser une variable de contrôle, un tableau de bool par exemple:
    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
     
                int r = 0;
                Random rand = new Random();
                int[] nbLoto = new int[7]; 
                bool[] dejaChoisi = new bool[49];
     
                for (int x=0;x<7;x++)
     
                    while(true)
                    {
     
                       if (dejaChoisi[r=rand.Next(1,49)])
                          continue;
     
                        nbLoto[x] = r;
                        dejaChoisi[r] = true;
                        break;
     
                    }
    ...ou si tu as un tableau beaucoup plus important, un Dictionary qui ne peut contenir que des clefs uniques:

    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
     
                int r = 0;
                Random rand = new Random();
                int[] nbLoto = new int[7]; 
                Dictionary<int, bool> dico = new Dictionary<int, bool>();
     
                for (int x=0;x<7;x++)
                    while(true)
                    {
                       if (dico.ContainsKey(r=rand.Next(1,49)))
                           continue;
     
                        nbLoto[x] = r;
                        dico.Add(r, true);
                        break;
                    }
    On peut aussi utiliser un uint64 et passer les bits à 1 pour les nombres déjà tirés ou prendre des chaines ou....une myriade d'autres solutions !

    Salutations.

  3. #3
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 661
    Par défaut
    Bonsoir,

    dommage tu étais près du but Fjsinfo, il te suffit de faire ça :

    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
     
                int[] nbLoto = new int[7];
                Random random = new Random();
     
                Console.WriteLine("Le Résultat du tirage du Loto est : ");
     
                for (int i = 0; i < nbLoto.Length; i++)
                {
                    int tirage = random.Next(0, 49);
     
                    if (!nbLoto.Contains(tirage))
                    {
                        nbLoto[i] = tirage;
                        Console.WriteLine("Numéro " + tirage);
                    }
     
                    else
                    {
                        i--;
                    }
                }
    PS : Si tu n'as pas la méthode Contains() pour ton tableau , pense a ajouter l'using suivant :


  4. #4
    Membre averti
    Femme Profil pro
    Informaticienne
    Inscrit en
    Mai 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Informaticienne
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 34
    Par défaut Merci
    Bonjour,

    Un très très grand merci à tous les 2!!!!!!
    Je ne suis pas douée pour le moment mais j'apprends
    A ce propos, je suis à la recherche d'un cahier de TP corrigés sur C# afin de m'exercer, auriez vous une idée?

    Merci encore pour votre aide à tous les 2.
    A très bientôt car je pense revenir très vite demander " au secours!!!"

  5. #5
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Une autre approche possible serait de partir d'un tableau contenant déjà tous les différents choix (tes nombres) et de le mélanger il ne resterait alors plus qu'à prendre les x premiers éléments.

    L'avantage de ce type de solution c'est qu'on ne risque pas de resté bloqué "longtemps" dans la partie qui choisit au pif puis vérifie si on l'a pas déjà pris (parce que si on a vraiment pas de bol on peut toujours reprendre le même nombre au pif)

    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
    using System;
    using System.Linq;
     
    class Program
    {
        static int[] choix = Enumerable.Range(0, 49).ToArray(); // ça ne devrait pas commencer à 1 plutôt d'ailleurs ?
        static Random random = new Random();
     
        // voir https://en.wikipedia.org/wiki/Random_permutation#Knuth_shuffles
        static void Melanger<T>(T[] array)
        {
            for (int i = 0, len = array.Length; i < len; ++i)
            {
                int j = random.Next(i, len); // on choisit une position entre là où on est et a fin
                // on inverse les éléments aux positions "i" et "j"
                T tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }
     
        static void Main()
        {
            Melanger(choix);
     
            Console.WriteLine("Le résultat du tirage du Loto est : ");
            foreach(int nombre in choix.Take(7))
            {
                Console.WriteLine("{0,7}", nombre);
            }
        }
    }

  6. #6
    Membre averti
    Femme Profil pro
    Informaticienne
    Inscrit en
    Mai 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Informaticienne
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2014
    Messages : 34
    Par défaut Merci pour votre aide
    Encore un grand merci pour votre aide à tous.
    A très bientôt.

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Juste pour info, se contenter d'utiliser Random tout simplement comme c'est fait ici ne garantit pas réellement un résultat aléatoire. En effet par défaut Random est seedée (initialisée) avec Environment.TickCount. Cette variable globale est basée sur le timer du système, donc si on récupère plusieurs nombres à la suite, en un très court laps de temps, il y a une forte probabilité d'obtenir plusieurs fois le même nombre aléatoire. La raison est que la valeur d'Environment.TickCount n'est pas rafraichie à chaque millisecondes comme on pourrait le penser, mais en fonction du système sur lequel le code tourne. Ca peut être mis à jour par exemple toutes les 12 millisecondes, ou autre... Ca suffit pour la grande majorité des applications, mais ca s'appelle du pseudo-aléatoire.

    Si on veut de l'aléatoire de meilleure qualité, il vaut mieux utiliser RNGCryptoServiceProvider. Cette classe est utilisée notamment en cryptographie, car on ne peut quasiment pas (voire pas du tout) prédire quelle valeur va sortir.

    Bon voilà pour ce cas du loto ce n'est pas forcément la peine d'aller aussi loin (quoique, le loto ne doit-il pas être le plus aléatoire possible ?), mais au moins on a explíqué les différentes approches
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/06/2009, 21h32
  2. Réponses: 12
    Dernier message: 10/06/2006, 23h16
  3. Réponses: 2
    Dernier message: 30/04/2006, 20h22
  4. [VBA-E]insertion automatique d'une ligne dans un tableau
    Par janus82 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/04/2006, 15h42

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