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 :

pb avec srand


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Points : 24
    Points
    24
    Par défaut pb avec srand
    Bonjour,
    j'ai un problème avec un génération de nombre aléatoire à cause je pense de srand((unsigned)(time(NULL))) sous visual c++ 6.
    En fait j'ai un lien de composition entre une classe filtre et une matrice. Le contenu de ma classe matrice est généré aléatoirement grâce a un rand()%6 puis je créé un filtre qui est un tableau de matrice grâce à une boucle.
    Ensuite pour que mes nombre soit vraiment tiré aléatoirement je dois initialise srand((unsigned)(time(NULL))); mais si je le mais dans mon constructeur de matrice celui-ci aura toujours la même valeur et si je le mets dans OnInitDialog() mon programme crash je ne sait donc pas ou le mettre.

    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
     
    matrice::matrice()
    {
     
    	tab= new cases**[2];
     
        for(int i=0;i<2;i++)
        {
            tab[i]=new cases*[2];
            for (int j=0;j<2;j++)
            {
    			tab[i][j]=NULL;
     
     
     
    		}
    	}
     
     
    srand((unsigned)(time(NULL)));
    int var = rand()%6;
     
    			switch (var)
                                {
                                    case 1:
    									tab[0][0]=new cases(true);
    									tab[0][1]=new cases(true);
    									tab[1][0]=new cases(false);
    									tab[1][1]=new cases(false);
                                        break;
                                    case 2:
                                        tab[0][0]=new cases(true);
    									tab[0][1]=new cases(false);
    									tab[1][0]=new cases(true);
    									tab[1][1]=new cases(false);
                                        break;
                                    case 3:
                                        tab[0][0]=new cases(true);
    									tab[0][1]=new cases(false);
    									tab[1][0]=new cases(false);
    									tab[1][1]=new cases(true);
                                        break;
                                    case 4:
                                        tab[0][0]=new cases(false);
    									tab[0][1]=new cases(true);
    									tab[1][0]=new cases(true);
    									tab[1][1]=new cases(false);
                                        break;
    								case 5:
                                         tab[0][0]=new cases(false);
    									tab[0][1]=new cases(true);
    									tab[1][0]=new cases(false);
    									tab[1][1]=new cases(true);
                                        break;
    								case 6:
                                        tab[0][0]=new cases(false);
    									tab[0][1]=new cases(false);
    									tab[1][0]=new cases(true);
    									tab[1][1]=new cases(true);
     
     
     
                                }
     
     
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    nb=n;
     
    	tab = new matrice*[n];
     
    	for (int i=0;i<n;i++)
    	{
    		tab[i] = new matrice;
    	}
    Merci à ceux qui voudront bien m'aider

  2. #2
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    rand te renvoi un nombre entre 0 et 1 donc forément tu auras toujours 1 dans ton cas.

    Fais plutot comme ça:

    [0-1]
    fois 6
    [0-6]
    modulo 6
    [0-6] en entier sans virgule
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    rand te renvoi un nombre entre 0 et 1 donc forément tu auras toujours 1 dans ton cas.
    Tu es sur de ça ? Moi je voyais plutôt ça :

    The rand function returns a pseudorandom integer in the range 0 to RAND_MAX (32767). Use the srand function to seed the pseudorandom-number generator before calling rand.
    Par contre pour le crash dans OnInitDialog,, ça me laisse perplexe. Es-tu bien sur que ça vienne de là ? Sinon, tu peux toujours le mettre à la création de ton appli (dans le WinMain)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Si vous désirez engendrer un entier aléatoire entre 1 et 10, vous devez toujours procéder en utilisant les bits de poids forts, comme dans :
    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));


    et jamais ainsi :
    j=1+(rand() % 10);


    (car cette derniere version utilise les bits de poids faibles)
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Par contre pour le crash dans OnInitDialog,, ça me laisse perplexe. Es-tu bien sur que ça vienne de là ? Sinon, tu peux toujours le mettre à la création de ton appli (dans le WinMain)
    A priori oui si je mets mon srand((unsigned)(time(NULL))) dans mon constructeur ça compile et fonctionne correctement hormis que le tirage n'est pas aléatoire mais si je l'enlève ou le met dans OnInitDialog ça compile mais dès que j'instancie mon filtre j'ai un crash.
    Par contre j'ai pas de main je suis sous visual c++ donc je sais toujours pas où mettre mon srand.

  6. #6
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    T'as essayé ce que j'ai mis?

    Tu as un message d'erreur pour le crash?

    Pourquoi un cast en unsigned? ça compile pas sans?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    T'as essayé ce que j'ai mis?

    Tu as un message d'erreur pour le crash?

    Pourquoi un cast en unsigned? ça compile pas sans?
    oui j'ai essayer ce que tu as mis.
    Je mets le unsigned je le mets parceque j'ai vu que c’était conseille pour la gestion de l'aléatoire lors de l'initialisation. Si je le mets ailleurs ou que je l'enlève ça me fait un rapport d'erreur lors de l’événement qui déclenche le constructeur

  8. #8
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Essaye d'afficher la variable générer pour voir ça valeur, ça me parait bizarre que ça te génere pas une valeur aléatoire.

    Edit: c'est bon j'ai compris.
    Tu utilise srand dans ton constructeur, donc tu réinitialise la graine a chaque construction, comme la construction prend moins de 1 sec, la graine est toujours la meme.met le srand au dessus de ta boucle de création.Ou alors garde un flag en statique dans ta classe pour savoir si ton srand a été fait
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par skeud Voir le message
    Essaye d'afficher la variable générer pour voir ça valeur, ça me parait bizarre que ça te génere pas une valeur aléatoire.

    Edit: c'est bon j'ai compris.
    Tu utilise srand dans ton constructeur, donc tu réinitialise la graine a chaque construction, comme la construction prend moins de 1 sec, la graine est toujours la meme.met le srand au dessus de ta boucle de création.Ou alors garde un flag en statique dans ta classe pour savoir si ton srand a été fait
    J'ai declaré un static flag que j'initialise a false dans mon constructeur je fait
    if(!flag)
    {
    srand((unsigned)(time(NULL)));
    flag=true;
    }
    int j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
    si je laisse mon if j'ai un crash a l'instanciation si je je l'enleve ca plante pas mais comme avant pas de génération aléatoire

  10. #10
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Je pense que ça vient du fait que le srand est fait dans un bloc qui se termine, du coup la graine est valable que pour cette partie la, au changement d'entité, la graine n'est pus valide.

    J'ai une méthode un peu porcasse mais qui pourrait fonctionné:

    Plutot qu'un flag, utilise un int, que tu incremente à chaque srand.
    Au moment du srand, utilise l'int plutot que le time(NULL).

    Je sais pas si ça fonctionnera mais on peut toujours essayer
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    srand((unsigned)(time(&flag)));;
    flag++;

    int j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
    il y a du progrès mes c'est pas encore ca . Ca ne crash plus et les valeurs changent à chaque exécution mais quand je construit mon tableau de matrice toute les matrice à l’intérieur sont les même.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    C'est bon ça marche merci pour ton aide voila
    if(flag==0)
    {
    srand((unsigned)(time(&flag)));;
    flag++;
    }
    int j=1+(int) (6*rand()/(RAND_MAX+1.0));

  13. #13
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Ah oui utilisé l'addresse, j'y avais pas penser ^^.

    Bon beh super si ça marche comme ça
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


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

Discussions similaires

  1. Problème avec srand
    Par yopiyop33 dans le forum Débuter
    Réponses: 5
    Dernier message: 02/12/2014, 18h38
  2. [PHP 5.3] Exception avec srand & rand: aucun résultat
    Par max235 dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2010, 21h25
  3. Problème avec srand() et rand()
    Par rouliane dans le forum C++
    Réponses: 10
    Dernier message: 16/12/2007, 19h35
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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