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 génération de deux doubles aléatoire


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Problème de génération de deux doubles aléatoire
    Bonjour, mon problème est le suivant, lorsque j'exécute mon code ci-dessous j'ai mes variables p.var et q.var qui sont identiques or lorsque je met un point d'arrêt sur la ligne et que lance mon prog, ils ne sont pas identiques donc je n'arrive pas à voir d'où vient le problème.


    Voici le 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace AlgorithmeRSA
    {
        class GNP
        {
            #region Données
            private double val;
            #endregion
     
            #region Constructeur
            public GNP()
            {
                Random r = new Random();
     
                this.val = r.Next(0, 99);
                while (this.EstPremier())
                {
                    this.val = r.Next(0, 99);
                }
            }
            #endregion
     
            #region Accesseur
            public double getVal()
            {
                return this.val;
            }
     
            public void setVal(int val)
            {
                this.val = val;
            }
            #endregion
     
            #region Fonctions
            public Boolean EstPremier()
            {
                int i;
     
            // Inférieur à 2 : pas premier
                if (this.val < 2) 
                    return false;
     
            // Egal 2 : premier
                if (this.val == 2) 
                    return true;
     
            // Nombre pair autre que 2 : n'est pas premier
                if ((this.val % 2) == 0) 
                    return false;
     
            // Teste tous les diviseur inférieur au nombre (de 2 à x-1)
                i = 3;
               while(i*i <= this.val)
                {     
            // Si on peut diviser ce nombre : il n'est pas premier
               if ((this.val % i) == 0) 
                   return false;
     
            // Passe au prochain diviseur
            i++;
            };
     
            // Aucun nombre compris entre 2 et Racine(x)
            // ne le divise : il est premier
            return true;
            }
            #endregion
        }
     
     
        class Program
        {
            static void Main(string[] args)
            {
                double n, phi;
                GNP p = new GNP();
                GNP q = new GNP();
                Console.WriteLine(p.getVal());
                Console.WriteLine(q.getVal());
                n = p.getVal() * q.getVal();
                phi = (p.getVal() - 1) * (q.getVal() - 1);
                Console.WriteLine(n);
                Console.WriteLine(phi);
                Console.ReadLine();
     
            }
        }
    }

  2. #2
    Expert éminent
    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 : 46
    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
    Points : 7 660
    Points
    7 660
    Par défaut
    Tu instancies un objet de type Random pour chaque objet GNP dans ton code. Tu ne précises pas de seed, donc la valeur initiale par défaut sera basée sur le temps. L'instanciation étant très rapide, tu te retrouves avec 2 générateurs ayant la même valeur initiale. Résultat, tu te retrouves avec la même succession de valeurs à chaque appel de Next.

    Au final cela revient à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Random r1 = new Random();
    Random r2 = new Random();
    Console.WriteLine(r1.Next(0, 99));
    Console.WriteLine(r2.Next(0, 99));
    Console.WriteLine(r1.Next(0, 99));
    Console.WriteLine(r2.Next(0, 99));
    ce qui ne fonctionne pas comme on le veut, car r1 et r2 vont générer la même suite de nombres.

    Le plus simple serait de définir un seul générateur, en le déclarant comme propre à la classe et non aux instances (static).
    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
    class GNP
    {
        private double val;
        private static Random r = new Random();
     
        public double Val
        {
            get { return val; }
        }
     
        public GNP()
        {
            this.val = r.Next(0, 99);
            while (this.EstPremier())
            {
                this.val = r.Next(0, 99);
            }
        }
     
        private bool EstPremier()
        {            
            ...
        }
    }
     
    class Program
    {
        static void Main(string[] args)
        {
            double n, phi;
            GNP p = new GNP();
            GNP q = new GNP();
            Console.WriteLine(p.Val);
            Console.WriteLine(q.Val);
            n = p.Val * q.Val;
            phi = (p.Val - 1) * (q.Val - 1);
            Console.WriteLine(n);
            Console.WriteLine(phi);
            Console.ReadLine();
     
        }
    }

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    ah au fait on peut faire plus rapide comme algo cf.
    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
            bool estPremier(int nb)
            {
                if (nb <= 3)
                    return true;
                else
                {
                    if (nb % 2 == 0)
                        return false;
                    else
                    {
                        int s = (int)Math.Sqrt(nb) + 1;
                        int i = 3;
                        while (i < s)
                        {
                            if (nb % i == 0)
                                return false;
     
                            i += 2;
                        }
     
                        return true;
                    }
                }
            }
    Ou encore ceux décris dans http://en.wikipedia.org/wiki/Prime_number

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Ok merci beaucoup pour ton aide. Je vais tester ce que tu viens de me dire. Merci encore.

Discussions similaires

  1. Problème de génération aléatoire
    Par sebdu94 dans le forum C
    Réponses: 13
    Dernier message: 19/05/2007, 18h04
  2. Génération de n nombres aléatoires différents
    Par progfou dans le forum Probabilités
    Réponses: 3
    Dernier message: 13/12/2005, 18h29
  3. [MYSQL] Problème ORDER BY sur deux champs
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 8
    Dernier message: 14/10/2005, 16h46
  4. Réponses: 2
    Dernier message: 25/09/2005, 21h30
  5. Problème de requêtes sur deux tables
    Par Pymm dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2005, 09h06

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