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 :

l'aléatoire avec rand()


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut l'aléatoire avec rand()
    Bonjour,

    J'utilise la fonction rand() pour générer des entiers aléatoirement. Mon problème à chaque exécution de mon programme, rand() me donne les mêmes valeurs pour un certains d'itérations dans le sous programme.

    J'explique autrement,
    J'ai une classe C1 qui contient deux fonctions f1 et f2. La première fonction fait appel à la deuxième et chacune d'entre elles utilise la fonction rand().

    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
     
    class C1
    {
        int fc1(int i)
        {
            int j;
            int somme;
            j=rand()%10;
            cout<<j<<endl;
            somme s=i+j;
            return somme;
        }
     
        int fc2()
        {
            int i;
            int j;
            i=rand()%5
            cout<<i;
            j=fc1(i);
            return j;
        }
     
        int fc3()
        {
            for(int i=0;i<4;i++)
            {
                int s;
                s=fc2()+i;
            }
            return s;
        }
    }
    La fonction main()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream> 
    using namespace std; 
    #include <time.h>
    #include "C1.h"
    int main() 
    {
        srand (time(NULL));
        int s=fc3();
        cout<<s<<endl;
        system("PAUSE");
        return 0;
    }
    Ce code ne représente pas vraiment mon code mais j'essaye de simplifier le problème afin de trouver la solution.
    En fait, l'exécution de ce programme donne toujours les mêmes valeurs générées avec rand(). ( pour la boucle for de fc3, les mêmes valeurs générées pour les trois fois)

  2. #2
    Membre expérimenté
    Homme Profil pro
    [SciComp]
    Inscrit en
    Août 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : [SciComp]

    Informations forums :
    Inscription : Août 2013
    Messages : 134
    Par défaut
    Bonjour,

    Si un si petit programme était appelé en rafale, avoir des résultats identiques ne m'étonnerait pas (pas forcément de changement de la graîne avec time), mais trois appels successifs identiques d'une fonction par un for où la graîne a été plantée à l'extérieur de la boucle, ça c'est embêtant.

    Après, je ne sais pas si la portion de code postée est représentative du problème rencontré. Car si je ne m'abuse, il y a pas mal d'erreurs qui ne permettront pas de compiler cette portion de code (Au pif: le "somme s" du calcul de somme dans la première fonction n'est pas une lvalue très canonique, le scope de s limité au for dans la troisième fonction, etc...).

    Pourriez vous préciser en postant un exemple minimal représentant votre problème qui fonctionne ?

  3. #3
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int fc3()
    {
        for(int i=0;i<4;i++)
        {
            int s;
            s=fc2()+i;
        }
        return s;
    }
    Ca compile ça ?!
    La variable "int s" doit être déclarée en dehors de la boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int fc3()
    {
        int s;
        for(int i=0;i<4;i++)
            s=fc2()+i;
        return s;
    }
    Plus de chance que ça fonctionne

  4. #4
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    Merci pour vos réponses.

    Le code ci dessus est écrit d'une manière rapide. Il ya plein de fautes de compilation. Mon vrai code compile et s'exécute sans aucun erreur. J'ai un problème avec la fonction rand(). Elle me donne les mêmes valeurs pour les trois itérations de la boucle for. Je sais pas comment avoir des valeurs différentes?

  5. #5
    Membre expérimenté
    Homme Profil pro
    [SciComp]
    Inscrit en
    Août 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : [SciComp]

    Informations forums :
    Inscription : Août 2013
    Messages : 134
    Par défaut
    A mon avis, si je fais en sorte que ce code compile, j'aurais bien des nombres aléatoires. Donc l'exemple ne semble pas correctement choisi

  6. #6
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Avec 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
     
    int fc1(int i)
    {
        int j;
        int somme;
        j=rand()%10;
        cout<<j<<endl;
        somme=i+j;
        return somme;
    }
     
    int fc2()
    {
        int i;
        int j;
        i=rand()%5;
        cout<<i<<endl;
        j=fc1(i);
        return j;
    }
     
    int fc3()
    {
        int s;
        for(int i=0;i<4;i++)
        {
            int f = fc2();
            s=f+i;
        }
        return s;
    }
     
    int main()
    {
        srand (time(NULL));
        int s=fc3();
        cout<<s<<endl;
        return 0;
    }
    Le résultat obtenu est :
    0
    7
    2
    5
    2
    6
    4
    0
    7
    #Edit Comme le dit xflr6, le problème est ailleurs.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/03/2014, 14h27
  2. [Valeur aléatoire] Problème avec rand()
    Par Machjaghjolu dans le forum C++
    Réponses: 4
    Dernier message: 06/12/2005, 17h10
  3. Selection aléatoire avec rand
    Par Ruddy16 dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/12/2005, 10h01
  4. SELECT avec RAND() mais plus avancé
    Par Sebou San dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/11/2005, 09h30
  5. Probleme de tirage avec rand ?
    Par sunshine33 dans le forum MFC
    Réponses: 5
    Dernier message: 14/01/2004, 15h57

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