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 :

Problème de boucle sous c#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut Problème de boucle sous c#
    Bonjour à vous tous;
    Je suis entrain d'écrire un petit programme qui génère un chiffre aléatoire. Le principe est de donné un chiffre quelconque "m", voir sur combien de bits il s'écrit "n", générer des bits aléatoires correspondant à la valeur de "n". Ensuite on compare la séquence trouvée avec le chiffre "m". Si le nombre trouvé "a" est supérieur à "m", on recommence l'opération jusqu'à trouver un nombre inférieur.

    Mon problème réside ici, je n'arrive pas à boucler mon programme. J'ai créé une méthode nombreAlea qui va faire le calcule du nombre "a" et une méthode bitAlea qui donne la séquence de bits aléatoire.
    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
     
    namespace ConsoleApplication1
    {
        static class NombreAleatoire
        {
            private static int[] rndBit;
            private static int k;
            private static double a;
     
            public static void nombreAlea(double m)
            {
                double n = Math.Truncate(Math.Log(m,2)) + 1;
                k = (int)n;
     
    found :
                bitAlea();
     
                for (int i = 0; i < n; i++)
                {
                    a = a + (rndBit[i]*Math.Pow(2, (n-1) - i));
                }
     
                if (a >= m)
                {
                    goto found;
                }
     
                TextBuffer.Add(a.ToString());
                TextBuffer.Display();
            }
     
            private static void bitAlea()
            {
                #region Génération des bits aléatoires
                Random rndBits = new Random();
     
                rndBit = new int[(int)k];
     
                for (int nbr = 0; nbr < k; nbr++)
                {
                    rndBit[nbr] = rndBits.Next(2);
                    TextBuffer.Add(rndBit[nbr].ToString());
                }
                #endregion 
            }
        }
    }
    Merci pour votre aide

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Déjà et avant tout
    Cette seule ligne mérite une bonne correction

    L'utilisation du goto est à éviter. Il y a peut être des cas où c'est utile, mais dans 99,99999% des cas on peut faire sans. Donc à bannir, sinon le fouet reviendra

    Ensuite pour faire une boucle il y a plusieurs possibilités, dans ton cas un do ... while serait le plus adapté.
    On peut également simplifier le code en utilisant certaines classes du framework.

    Cela pourrait donner ceci 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
        public static class RandomNumber
        {
            public static int GetRandomNumber(int seed)
            {
                int result = 0;
     
                // Si le seed vaut 0, on ne peut pas avoir de valeur inférieure. 
                // On renvoie alors 0, sinon on génère un nombre aléatoire.
                // (on suppose que l'on ne gère pas de bit de signe, seed >= 0)
                if (seed != 0)
                {
                    Random random = new Random();
     
                    // On récupère le nombre de bits nécessaires pour coder le seed.
                    int bitsNeeded = Convert.ToString(seed, 2).Length;
     
                    do
                    {
                        // On génère une valeur binaire sur une longueur de "bitsNeeded" bits
                        // sous la forme d'une chaîne de caractères
                        string binaryValue = null;
                        for (int i = 0; i < bitsNeeded; i++)
                        {
                            // On ajoute des 0 ou des 1 à la chaîne de caractères.
                            binaryValue += random.Next(0, 100) % 2 == 0 ? "0" : "1";
                        }
     
                        // On converti la chaîne de caractères en entier.
                        result = Convert.ToInt32(binaryValue, 2);
                    }
                    // On recommence tant que le résultat est supérieur ou égal au seed.
                    while (result >= seed);
                }
     
                return result;
            }
        }
    Dans ce cas de figure on utilise les méthodes Convert.ToString et Convert.ToInt32 en indiquant sur quelle base on travaille. Ici on travaille en binaire donc base 2. Pas besoin de s'embêter avec les maths comme ça

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Re-bonjour,
    Tout d'abord merci d'avoir répondu aussi rapidement . En ce qui concerne mon programme, j'ai un algorithme bien précis que je dois faire, d'où les maths . Et pour "goto", c'est très simple aussi , j'ai suivi un parcours électronique, et j'ai beaucoup travaillé en .asm notamment sur les PICs. Donc quand j'ai vu le GOTO, j'ai pensé que c'était le même principe . En tout cas PLUS DE GOTO promis.
    Mon programme est en fait un TP de cryptographie, on nous a donné un algorithme en cours, puis on nous a demandé de le retranscrire en code. Donc est-ce qu'il serait possible de modifier mon code pour obtenir le même résultat que sur l'ex qui m'a été donné dans les message précédent.

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par sorrow08 Voir le message
    Donc est-ce qu'il serait possible de modifier mon code pour obtenir le même résultat que sur l'ex qui m'a été donné dans les message précédent.
    C'est possible. Tu gardes la logique de mon exemple en remplaçant les différents points (récupérer le nombre de bits, générer un nombre aléatoire sur n bits...) par ton code.

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    J'ai suivi la même logique, mais j'ai un problème, mais apparemment il ne boucle pas. Quand la valeur de "a" est inférieure à "m", le résultat est affiché. Donc le cas contraire il n'affiche rien.

    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
     
    namespace ConsoleApplication1
    {
        static class NombreAleatoire
        {
            private static int[] rndBit;
            private static int k;
            private static double a;
     
            public static void nombreAlea(double m)
            {
                double n = Math.Truncate(Math.Log(m,2)) + 1;
                k = (int)n;
     
                do
                {
                    bitAlea();
     
                    for (int i = 0; i < n; i++)
                    {
                        a = a + (rndBit[i] * Math.Pow(2, (n - 1) - i));
                    }
                }
                while (a >= m);
     
                TextBuffer.Add(a.ToString());
                TextBuffer.Display();
            }
     
            private static void bitAlea()
            {
                #region Génération des bits aléatoires
                Random rndBits = new Random();
     
                rndBit = new int[(int)k];
     
                for (int nbr = 0; nbr < k; nbr++)
                {
                    rndBit[nbr] = rndBits.Next(2);
                    TextBuffer.Add(rndBit[nbr].ToString());
                }
                #endregion 
            }
        }
    }
    Je n'arrive pas à mettre la main sur le problème.

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par sorrow08 Voir le message
    J'ai suivi la même logique, mais j'ai un problème, mais apparemment il ne boucle pas. Quand la valeur de "a" est inférieure à "m", le résultat est affiché. Donc le cas contraire il n'affiche rien.
    C'est bien le but ? De boucler jusqu'à avoir une valeur inférieur à m ? Sinon met ton affichage dans la boucle pour voir toutes les valeurs générées.

  7. #7
    Membre averti
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    J'ai essayé ça aussi. Si il génère un nombre inférieur à "m" du premier coup il l'affiche. Si c'est pas le cas, il ne re-boucle pas pour refaire la même opération. J'ai ajouté une variable dans la boucle pour calculer le nombre de boucles. Mais elle ne dépasse jamais une. Ma boucle est-elle correcte ?!

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

Discussions similaires

  1. [Smarty] Problème de boucle MySQL sous Smarty
    Par slaxsystem dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 29/04/2007, 17h28
  2. [Install] Problème de lancement sous debian sid
    Par SoaR245 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 18/02/2004, 10h01
  3. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52
  4. Problème d'include sous Dev-c++ 4.9.8.0
    Par Argonz dans le forum Dev-C++
    Réponses: 16
    Dernier message: 20/11/2003, 17h36
  5. Problème avec CopyDir sous D5
    Par Houben Jacques dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 22h02

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