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 :

Remplir de manière aléatoire une liste en double


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    novembre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : novembre 2020
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Remplir de manière aléatoire une liste en double
    Bonjour,
    Je souhaite remplir avec des double une liste de manière aléatoire et j'aimerais que les double soient des chiffre avec deux numéros après la virgule, et par la suite calculer la moyenne de la liste.



    j'ai écris une méthode et un bout de programme mais ça ne marche pas, quelqu’un pourrait-il m'aider?

    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
     
     static void CalculMoyenne(int MyNum1, int MyNum2)
                {
                    //Generer des chiffres double aleatoires
     
                    //Créer la liste
                    List<double> chiffres = new List<double>();
                    Console.WriteLine("Veuillez entrer le premier chiffre de la liste");
                    MyNum1 = Convert.ToInt32(Console.ReadLine());
                    Console.WriteLine("Veuillez entrer le second chiffre");
                    MyNum2 = Convert.ToInt32(Console.ReadLine());
                    int i;
                    for (i = MyNum1; i <= MyNum2; i++)
                    {
                        var Aleatoire = new Random() ;
                        double Chiffre_Virgule = Aleatoire.Next(2);
                        chiffres.Add(Chiffre_Virgule);
                        Console.WriteLine(chiffres);
                    }
                    //Sommer toutes les lignes et afficher le resultat
                    double SommeList = chiffres.Sum();
                    double Moyenne = SommeList / MyNum2;
                    Console.WriteLine(Moyenne);
                }
                CalculMoyenne(MyNum1, MyNum2);

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    janvier 2014
    Messages
    529
    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 : 529
    Points : 1 832
    Points
    1 832
    Par défaut
    Bonjour,

    Deux problèmes du coup

    • Tu as dû le voir mais déclarer & créer un objet Random dans une boucle est une très mauvaise idée, car cela va donner toujours le même résultat, c'est dû à comment est créer un nombre aléatoire en informatique. Il te suffit de bouger cette ligne avant la boucle.
    • Next(x) ne génère que des nombres entier. Il y a bien NextDouble() mais il génère qu'un double entre 0 et 1. Donc il n'y a pas de méthode toute faite. Par contre avec NextDouble() tu peux facilement en bricoler une.


    En ce qui concerne la limitation à 2 chiffres après la virgule, tu as une méthode toute faite pour, il s'agit de Math.Round().

    Voilà tu devrais avoir toutes les pistes. Tu affiches aussi juste le tableau et pas le nombre lui même, mais bon c'est du détail.

    Juste une petite précision, quand tu dis "ça marche pas", précise juste le comment du pourquoi. La encore c'est un code assez facile mais pour un problème plus dur, ça aide beaucoup ceux qui veulent t'aider. :)
    Keep calm and debug it

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 4 057
    Points : 7 273
    Points
    7 273
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Sauf si c'est mentionné explicitement dans l'énoncé d'un TD, "manipuler des doubles à deux chiffres après la virgule" est un antonyme.

    Soit tu manipules des doubles (fractions à virgule flottante NON FINIES) soit tu manipules des décimaux FINIS (et donc potentiellement à deux chiffres après la virgule).

    En effet, "0.01" en double, ça n'est absolument pas égal à 0.01, mais potentiellement 0.010000000012345 ou 0.009999999999992334

    Si tu as besoin de manipuler des nombres avec une précision finie, alors tu vas avoir tôt ou tard des erreurs d'arrondis. Je ne compte pas le nombre d'ERP ou de logiciels de Compta qui manipulent des montants sous forme de doubles et qui sont obligés de générer des lignes de régul en raison des anomalies d'arrondi avec les calculs de TVA, taxes et remises.

    Attention par contre, d'un point de vue performances les calculs sont lourdement pénalisés par le type décimal, qui est plus complexe à manipuler et lourd à stocker en mémoire.
    On a donc, en terme de rapidité de calcul et stockage mémoire :

    int (4 octets) > double (8 octets) >>>> decimal (16 octets !!!)

    Astuce d'optimisation :

    Si ton programme doit donc être taillé pour la vitesse (calculer des moyennes sur des milliards de nombres en quelques centièmes de seconde) alors tu as tout intérêt à partir du principe qu'un nombre décimal à deux décimales peut être converti en entier sans perte de précision par une simple multiplication, par 100.
    Ainsi, tu génères tes nombres avec Next() qui retourne un int, tu les stocke et manipule tels quels, et tu n'a qu'à diviser les nombres par 100 à l'affichage.
    Ton programme sera 4 fois plus léger en mémoire et probablement 10 à 20 fois plus rapide qu'avec le type decimal (et 3 à 4 fois plus qu'avec double).
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    juin 2007
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : juin 2007
    Messages : 852
    Points : 1 822
    Points
    1 822
    Par défaut
    À cela j'ajouterais que vouloir manipuler des "doubles avec au maximum deux chiffres après la virgule" n'a pas vraiment de sens. Déjà parce-que techniquement ça ne fonctionne pas comme-ça (voir la doc sur les types à virgule flottante). Ensuite où se situe cette restriction ? À la saisie ? À l'affichage ? À la précision des calculs ? Dans ce dernier cas l'approche de StringBuilder est probablement la meilleure (à l'exception des divisions qui devront passer par une conversion à cause des pertes de données engendrées par la division entière).

Discussions similaires

  1. Caster le résultat d'une liste en double
    Par Incinerator dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 24/11/2008, 12h28
  2. Remplire un Formulaire via une liste de choix
    Par vincent477 dans le forum VBA Access
    Réponses: 7
    Dernier message: 04/10/2008, 17h15
  3. Réponses: 8
    Dernier message: 06/08/2008, 15h59
  4. Réponses: 3
    Dernier message: 25/10/2007, 21h57
  5. remplir un textarea grace à une liste
    Par akara dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/07/2007, 17h30

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