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 :

Loi binomiale en C#


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 8
    Points
    8
    Par défaut Loi binomiale en C#
    Bonjour,

    Quelqu'un parmi vous sait il s'il existe une fonction permettant de calculer une loi binomiale ?

    Après quelques recherches je ne trouve pas en C#.

    Rappel, exemple de site permettant le calcule d'une loi binomiale : http://irem.univ-reunion.fr/IMG/html/binomiales.html

    D'avance merci

  2. #2
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Tu pourrais essayer de transposer le code javascript de ton lien en C#
    Sinon, il y a quelques idées ici.
    Et la solution la.
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Salut merci de ta réponse.

    J'ai regardé la solution pour voir et j'ai essayé de faire l'application qu'il indique, sauf qu'elle ne marche pas é.è

    Je ne comprend pas pourquoi, je veux par exemple faire 100, 1 et 0.01 mais ça plante message d'erreur tentative division par 0 :/

    EDIT :

    Ok j'ai trouvé le soucis, factorielle 99 ça fait un très très très très grand nombre qui ne rentrait pas dans le type de variable défini, après avoir tout remplacé par des doubles ça fonctionne nickel chrome.

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    En plus des int pour représenter des entiers en C# tu dispose des long qui sont codés sur 64 bits, et au-delà encore des decimal qui sont codés sur 128 bits (dont 96 bits pour la partie entière, il me semble).

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Ok

    Maintenant je me heurte à un problème de variable, on ne peut pas stocker des nombres "infinis" dans ces variables, ce qui me pose problème.

    En effet, le code que tu m'as donné fonctionne très bien et j'ai pu l'adapter à mon utilisation.

    Cependant, je peux être amené à calculer 5000! et ça n'est absolument pas possible avec les variables dont on dispose.

    Voir par exemple ce site qui permet de la calculer : https://fr.numberempire.com/factorialcalculator.php on se croirait dans Matrix tant il y a de nombres qui défilent.

    Alors le casse tête c'est, comment calculer une telle factorielle en C# ?

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par chyrla Voir le message
    Maintenant je me heurte à un problème de variable, on ne peut pas stocker des nombres "infinis" dans ces variables, ce qui me pose problème.
    Normal. La mémoire d'un ordinateur n'est pas infinie. Donc impossible de stocker des nombres "inifinis"

    Citation Envoyé par chyrla
    Alors le casse tête c'est, comment calculer une telle factorielle en C# ?

    Je t'invite à regarder la classe BigInteger qui a justement pour objectif de manipuler des entiers de taille arbitraire.

    Par contre, il faut s'attendre à un impact important sur les performances. Mais vu la taille des nombres, c'est normal
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Bonjour, merci pour la classe BigInteger !

    J'ai pu la mettre en place et l'utiliser et du coup, j'arrive à calculer jusqu'à la factorielle 322, mais après, je bloque de nouveau, je suis donc encore assez loin de l'objectif de 2000! voir 5000!, soyons fous.

    Je ne sais pas s'il est possible de forcer le BigInteger à être sur 2048 bits voir 4096 ? Si oui comment faire ?

    D'avance merci.

    PS : voici le code que j'ai utilisé pour calculer factorielle 322 :

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Numerics;
     
     
    namespace ConsoleApp1
    {
        class Program
        {
            public static BigInteger Factorial(BigInteger x)
            {
                if (x <= 1)
                    return 1;
                else
                    return x * Factorial(x - 1);
     
            }
     
     
            static void Main(string[] args)
            {
     
     
                BigInteger test1 = new BigInteger("1000", 10);
                BigInteger test2 = new BigInteger("1000", 10);
                int boucle = 1;
     
                for (boucle=1;boucle<=test1;boucle++)
                {
                    test2 = test2 * boucle;
                    Console.WriteLine("facto "+boucle+" : "+test2);
                }
     
     
                Console.WriteLine(test2);
     
                Console.ReadLine();
     
            }
        }
    }
    L'erreur que je récupère : System.ArithmeticException*: 'Multiplication overflow.'

    Comment je peux faire une multiplication sans passer par la multiplication ? ._.

  8. #8
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    C'est bizarre, j'ai pu pousser jusqu'à la factorielle 5000 sans soucis avec votre code.

    Il y a juste une chose qui m'étonne ; je ne peux utiliser votre code directement, car j'ai des erreurs de compilation. Le constructeur de BigInteger est inconnu. Aucun ne prend 2 arguments. J'ai donc du les corriger.

    Comment le compilez-vous ? Vous utilisez bien la classe BigInteger du framework .NET et non une autre implémentation ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    J'ai honte de moi.

    J'ai utilisé un paquet NuGet, celui ci pour être précis : https://www.codeproject.com/Articles...gInteger-Class

    Et effectivement rien à voir avec celui intégré par défaut, mais le Numerics n'était pas ajouté donc je ne pouvais pas me servir de la "vraie" class.

    J'arrive bel et bien à calculer la facto 5000.

    Ah mais c'est pas possible d'être si c*n

    Heureusement que des gens sont là pour me faire piger mes erreurs.

    J'ai donc du ajouter la référence manuellement et là, pas de soucis !

    Bon à voir si je vais réussir à adapter le code de calcul binomial avec les bigInteger

  10. #10
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par chyrla Voir le message
    J'ai honte de moi.

    J'ai utilisé un paquet NuGet, celui ci pour être précis : https://www.codeproject.com/Articles...gInteger-Class

    Et effectivement rien à voir avec celui intégré par défaut, mais le Numerics n'était pas ajouté donc je ne pouvais pas me servir de la "vraie" class.
    Ca peut arriver à tout le monde

    Pour information, sur la MSDN, il est indiqué pour chaque classe l'Assembly dans lequel elle est définie. Par exemple, pour BigInteger, il est bien spécifié que c'est dans System.Numerics. Cela peut éviter de nombreuses recherches


    Bon courage pour la suite.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Oui effectivement ça arrive haha.

    Sinon, ça a quand même un peu a voir avec le thread.

    Le programme semble utiliser un seul coeur du processeur.

    Si je veux que le programme utilise plusieurs coeur, ça se passe ou ? dans le code ?

    Car la je suis en train de calculer factorielle 1 000 000 et c'est plutôt lent, mais le processeur monte qu'à 20% de charge, donc j'aimerais autant faire du multicoeur pour accélérer tout ça

    D'ailleurs si ça intéresse quelqu'un d'avoir 100 000! je la met ici :

    factorielle100k.7z

  12. #12
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par chyrla Voir le message
    Le programme semble utiliser un seul coeur du processeur.

    Si je veux que le programme utilise plusieurs coeur, ça se passe ou ? dans le code ?
    Je ne suis pas sur que la classe gère elle-même le multithreading, et qu'il va donc falloir paralléliser vos calculs.
    Par chance, le calcul d'une factorielle se parallélise très bien.

    Par exemple 1000! = 1x2x3x...x999x1000, donc on peut faire :
    • un premier thread qui calcule 1x2x...x250 ;
    • un second thread qui calcule 251x...x500 ;
    • un troisième qui calcule 501x...x750 ;
    • le dernier qui calcule 751x...x1000.


    Ensuite, il ne reste qu'à multiplier le résultat de chacune de ces tâches pour obtenir la factorielle finale.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Quelque part ou je pourrais me documenter sur comment indiquer tel thread fait telle chose ?

  14. #14
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    J'ai écris une série d'article sur l'utilisation du pool de threads. Le premier article peut être une source d'idée : https://fdorin.developpez.com/tutori...eadpool/part1/

    Les autres articles sont disponibles à partir de ma page (cf. lien dans ma signature).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. Ajustement à une loi binomiale négative
    Par inforum dans le forum SAS STAT
    Réponses: 3
    Dernier message: 30/04/2016, 08h15
  2. Variable aléatoire & loi binomiale
    Par yoshï dans le forum Probabilités
    Réponses: 0
    Dernier message: 03/10/2012, 00h03
  3. Estimation des paramètres d'une loi binomiale
    Par kamelcompte dans le forum Mathématiques
    Réponses: 2
    Dernier message: 28/12/2011, 13h26
  4. Utilisation CRITERE.LOI.BINOMIALE
    Par Mica--> dans le forum Excel
    Réponses: 2
    Dernier message: 20/02/2008, 12h39
  5. Réponses: 3
    Dernier message: 08/04/2007, 08h38

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