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 :

Generateur aléatoire en fonction d'une somme


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Par défaut Generateur aléatoire en fonction d'une somme
    Bonjour, je voudrais en fonction d'une somme rentrée que le programme me trouve 4 nombres aléatoires qui fassent cette somme.

    J'ai commencé, j'ai testé mais sa met vraiment trop longtemps

    Je vous met mon code, pouvez vous me dire ce qui cloche s'il vous plait

    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
    #include <iostream.h>
    #include <stdlib.h>
    int somme ;
    int a;
    int b ;
    int c;
    int d;
     
    int main()
    {
     
     
        cout << " Entrez la somme " ;
        cin >> somme ;
     
     
        while (a+b+c+d != somme)
              {
               a = rand();
               b = rand();
               c = rand();
               d = rand ();
              }
        cout << a ;
        cout << b ;
        cout << c ;
        cout << d ;
    return 0 ;
    }

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Bonjour,

    y'a t-il une limitation concernant tes nombres aléatoires?

    Si ils doivent tous être inférieurs à ta somme, tu peux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        while (a+b+c+d != somme)
              {
               a = rand() % somme;
               b = rand() % somme;
               c = rand() % somme;
               d = rand() % somme;
              }
    Sinon par exemple si tu rentres somme = 10, il te sortira de toutes facon que des nombres positifs dont la plupart font des dizaines de milliers, ou plus selon ton système.

    Note que si tu veux un moyen "plus aléatoire" pour avoir un nombre entre 0 et somme, tu peux regarder ici.

    Enfin, n'oublie pas d'initialiser le générateur pseudo-aléatoire avec srand(time(NULL))

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Gia,

    Une fois tirés les 3 premiers nombres, le 4ème est fixé, ton programme a peu de chances de tirer au hasard cette valeur fixée, et donc il doit boucler très souvent.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Par défaut
    tu calcules aléatoirement a entre 0 et somme et ensuite b entre 0 et (somme-a) puis c entre 0 et (somme-a-b)...

    C'est moins long et aléatoire

    ++

  5. #5
    Membre chevronné Avatar de aziz jim
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 455
    Par défaut
    Citation Envoyé par Parile Voir le message
    tu calcules aléatoirement a entre 0 et somme et ensuite b entre 0 et (somme-a) puis c entre 0 et (somme-a-b)...

    C'est moins long et aléatoire

    ++
    J'ajoute : Une fois a et b et c tirés, d = somme - (a+b+c);
    ça va donner qq chose comme ceci :
    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
     
    #include <iostream>
    #include <stdlib.h>
    #include <windows.h>
     
     
    using namespace std;
     
    int somme ;
    int a;
    int b ;
    int c;
    int d;
     
    int main()
    {
        cout << " Entrez la somme " ;
        cin >> somme ;
     
        srand(GetTickCount());
        while (a+b+c+d != somme)
              {
                  a = rand() % somme;
                  b = rand() % (somme - a);
                  c = rand() % (somme - (a+b));
                  d = somme - (a+b+c);
              }
        cout << a <<endl;
        cout << b <<endl;
        cout << c <<endl;
        cout << d <<endl;
        system("pause") ;
    }

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Par défaut Sa marche
    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
    #include <iostream>
    #include <stdlib.h>
    #include <windows.h>
     
     
    using namespace std;
     
    int somme ;
    int a;
    int b ;
    int c;
    int d;
     
    int main()
    {
        cout << " Entrez la somme " ;
        cin >> somme ;
     
        srand(GetTickCount());
        while (a+b+c+d != somme)
              {
                  a = rand() % somme;
                  b = rand() % (somme - a);
                  c = rand() % (somme - (a+b));
                  d = somme - (a+b+c);
              }
        cout << a <<endl;
        cout << b <<endl;
        cout << c <<endl;
        cout << d <<endl;
        system("pause") ;
    }

    Sa marche bien, merci beaucoup mais j'aimerai eviter les doublons et je sais pas du tout comment faire vous auriez pas une idée s'il vous plait ?

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Déjà, tu n'as plus besoin de ta boucle while...

    Ensuite, si tu veux éviter les doublons, tout d'abord, c'est que tes nombres ne sont plus aléatoires... Il faut définir plus précisément ce que tu veux dans ce cas (mais bon, dans la méthode que tu as implémentée, il ne sont pas vraiment aléatoires non plus...).

    Ensuite, c'est potentiellement impossible : somme = 4, je te mets au défi de trouver 4 nombres sans doublon qui fassent cette somme.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre chevronné Avatar de aziz jim
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 455
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Déjà, tu n'as plus besoin de ta boucle while...
    Qu'est ce qui va arriver si on donne la valeur 0 à somme en l'absene de la boucle?

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Parile Voir le message
    tu calcules aléatoirement a entre 0 et somme et ensuite b entre 0 et (somme-a) puis c entre 0 et (somme-a-b)...

    C'est moins long et aléatoire
    C'est aléatoire, certes, mais b a une probabilité plus grande d'être supérieur à somme/2 que l'inverse, et C encore pire... C'est donc non équiprobable.

    A mon avis (mais j'en suis pas certain, faudrait faire des probas, et j'ai toujours été fâché avec les probas...) il serait plus juste de tirer 3 nombres n1, n2 et n3 entre 0 et somme, puis de les classer dans l'ordre.

    0---------n1------n2--------------------n3----------------somme

    On prend alors a = n1, b = n2-n1, c = n3-n2, d = somme-n3
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/01/2012, 17h07
  2. Réponses: 3
    Dernier message: 06/12/2011, 19h56
  3. Réponses: 13
    Dernier message: 05/11/2007, 09h00
  4. tri aléatoire avec une somme fixe
    Par mikele dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 23/09/2007, 20h34
  5. fonction sur la somme des valeurs issues d'une requete
    Par iam dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/06/2006, 21h35

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