Problème pour générer des nombres aléatoires

cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007 - 20 avril 2007 à 20:19
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 - 24 avril 2007 à 11:55
Hello !
Voilou je suis débutante en c++. Je dois faire un jeu de yams mais j'ai un problème : pour le premier lancer de dé tout va bien mais pour le second il me génère exactement les même nmbres qu'au premier et idem pour le troisième. Je vous mets le début du programme

#include
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
using namespace std ;
int hasard(int min, int max);
int hasard(int min, int max){
return (int) (min + ((float) rand() / RAND_MAX * (max - min + 1)));
}

main ()
{ int a, b, c, d, e, i, n, p ;
int vect[5];
bool de1, de2, de3, de4, de5 ;
int min = 1;
int max = 6;
srand(time(NULL));

//premier lancer
a=hasard(min, max);
b=hasard(min, max);
c=hasard(min, max);
d=hasard(min, max);
e=hasard(min, max);
de1=false;
de2=false;
de3=false;
de4=false;
de5=false;
cout<<"dé1 :" <>n;
if (n==1)
de1=true;
if (n==2)
de2=true;
if (n==3)
de3=true;
if (n==4)
de4=true;
if (n==5)
de5=true;}

//deuxième lancer
if (de1=false)
a=hasard(min, max);
if (de2=false)
b=hasard(min, max);
if (de3=false)
c=hasard(min, max);
if (de4=false)
d=hasard(min, max);
if (de5=false)
e=hasard(min, max);
cout<<"dé1 :" <>n;
if (n==1)
de1=true;
if (n==2)
de2=true;
if (n==3)
de3=true;
if (n==4)
de4=true;
if (n==5)
de5=true;}

//troisième lancer
if (de1=false)
a=hasard(min, max);
if (de2=false)
b=hasard(min, max);
if (de3=false)
c=hasard(min, max);
if (de4=false)
d=hasard(min, max);
if (de5=false)
e=hasard(min, max);
cout<<"dé1 :" <<a<<"    dé2 :" <<b<<"    dé3 :" <<c<<"    dé4 :" <<d<<"    dé5 :" <<e ;}

J'utilise dev c++.
J'ai déjà essayé d'autres façon de générer des nombres aléatoires mais je reviens toujours au même problème et j'arrive pas à comprendre pourquoi.
Pouvez-vous m'aider svp ?
Merci

18 réponses

bipcpp Messages postés 40 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 2 mai 2010
20 avril 2007 à 23:48
Peut-être :

//deuxième lancer
if (de1==false)
a=hasard(min, max);

ou

//deuxième lancer

if (!de1)

a=hasard(min, max);
0
gamemonde Messages postés 336 Date d'inscription samedi 9 août 2003 Statut Membre Dernière intervention 9 juillet 2011 2
21 avril 2007 à 00:55
de1=false retourne toujours vrai
0
cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007
21 avril 2007 à 09:38
merci bipcpp j'avais pas vu cette erreur je vais la corriger et je dis si ça marche.
gamemonde ce que je voulais dire c'est de1 prends la valeur false
0
cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007
21 avril 2007 à 09:40
bipcpp j'ai corrigé mais j'ai toujours le même problème !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
21 avril 2007 à 10:30
Normal place ca en debut de ton programme pour initialiser le generateur de nombres.



srand(GetTickCount());
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
21 avril 2007 à 10:35
Ha mince j'avais pas vu que tu avais mit
srand(time(NULL));
Essaye avec GetTickCount() pour tester
0
cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007
21 avril 2007 à 10:52
OK j'essaie
0
cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007
21 avril 2007 à 10:55
Je désespère ça marche pas !!!!!!!!!!!!!!!
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
21 avril 2007 à 11:06
Remet ton code complet, moi j'ai testé une version simplifié sans count et cin et ca marche sans probleme avec les modifs de bipcpp

main () {
int a, b, c, d, e, i, n, p ;
int vect[5];
BOOL de1, de2, de3, de4, de5 ;
int min = 1;
int max = 6;
srand(time(NULL));

//premier lancer
a=hasard(min, max);
b=hasard(min, max);
c=hasard(min, max);
d=hasard(min, max);
e=hasard(min, max);
de1=FALSE;
de2=FALSE;
de3=FALSE;
de4=FALSE;
de5=FALSE;

if (de1==FALSE)
a=hasard(min, max);
if (de2==FALSE)
b=hasard(min, max);
if (de3==FALSE)
c=hasard(min, max);
if (de4==FALSE)
d=hasard(min, max);
if (de5==FALSE)
e=hasard(min, max);
0
cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007
21 avril 2007 à 11:08
Ah je vais essayer en mettant comme toi les FALSE en majuscule
0
cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007
21 avril 2007 à 11:14
ça me donne ça
#include <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

using namespace std ;

 

 

int hasard(int min, int max);

 

 

int hasard(int min, int max){

return (int) (min + rand() % (max - min) );

}

 

 

main ()

{ int a, b, c, d, e, i, n, p ;

int vect[5];

bool de1, de2, de3, de4, de5 ;

int min = 1;

int max = 6;

srand(time(NULL));

 

//premier lancer

 

a=hasard(min, max);

b=hasard(min, max);

c=hasard(min, max);

d=hasard(min, max);

e=hasard(min, max);

de1=FALSE;

de2=FALSE;

de3=FALSE;

de4=FALSE;

de5=FALSE;

cout<<"dé1 :" <    dé2 :" <    dé3 :" <<c<<"    dé4 :" <<d<<"    dé5 :" <<e ;

cout<<"\n Quels dés voulez-vous garder ? (Entrer le numéro d'un dé puis entrer puis un autre dé, etc et à la fin taper -1)" ;

n=0;

while (n!=-1)

{ cin>>n;

if (n==1)

de1=TRUE;

if (n==2)

de2=TRUE;

if (n==3)

de3=TRUE;

if (n==4)

de4=TRUE;

if (n==5)

de5=TRUE;}

//deuxième lancer

if (de1==FALSE)

a=hasard(min, max);

if (de2==FALSE)

b=hasard(min, max);

if (de3==FALSE)

c=hasard(min, max);

if (de4==FALSE)

d=hasard(min, max);

if (de5==FALSE)

e=hasard(min, max);

cout<<"dé1 :" <    dé2 :" <    dé3 :" <<c<<"    dé4 :" <<d<<"    dé5 :" <<e ;

de1=FALSE;

de2=FALSE;

de3=FALSE;

de4=FALSE;

de5=FALSE;

cout<<"\n Quels dés voulez-vous garder ? Puis taper -1" ;

n=0;

while (n!=-1)

{ cin>>n;

if (n==1)

de1=TRUE;

if (n==2)

de2=TRUE;

if (n==3)

de3=TRUE;

if (n==4)

de4=TRUE;

if (n==5)

de5=TRUE;}

//troisième lancer

if (de1==FALSE)

a=hasard(min, max);

if (de2==FALSE)

b=hasard(min, max);

if (de3==FALSE)

c=hasard(min, max);

if (de4==FALSE)

d=hasard(min, max);

if (de5==FALSE)

e=hasard(min, max);

cout<<"dé1 :" <    dé2 :" <    dé3 :" <<c<<"    dé4 :" <<d<<"    dé5 :" <<e ;}

mais ça marche toujours pas !
0
cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007
21 avril 2007 à 11:32
c'est bon je crois que j'ai la solution : j'ai mis
#include <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

using namespace std ;

 

 

int hasard(int min, int max, int prec) ;

{srand(time(NULL)+prec);

int nb;

nb=rand() % (max-min) + min;

 

return nb; }

 

 

main ()

{ int a, b, c, d, e, i, n, p ;

int vect[5];

bool de1, de2, de3, de4, de5 ;

int min = 1;

int max = 6;

int t;

char lu[10];

 

 

//premier lancer

 

a=hasard(min, max, 1);

b=hasard(min, max, a);

c=hasard(min, max, b);

d=hasard(min, max, c);

 
0
cs_Etoiline Messages postés 24 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 26 avril 2007
21 avril 2007 à 11:54
J'ai un autre blème dans mon programme (décidément ya que ça !) : il ne m'affiche pas les résultats du troisième lancer au lieu de ça la fenêtre d'exécution se ferme. Pourquoi ?
0
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
21 avril 2007 à 15:14
Salut,

Afin de faire plusieurs lancers d'affilés il faudrait utiliser une boucle for puis sauvegarder les resultats dans un vector . Avec çà ton code sera plus lisible et donc plus à comprendre.
A quoi çà sert de faire copier coller lorsque la bouckle le fait pour toi?

A+

<hr />A bientôt.

Nico
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
24 avril 2007 à 11:43
Salut,

pour la fermeture intempestive du programme avant l'affichage des résultats, essaie de rajouter à la fin de ton code ceci :

        system("pause");

si t'as des erreurs la dessus, je crois qu'un include de windows.h peut pallier au problème.

l'explication c'est qu'une fois qu'il a affiché ton résultat, le programme est terminé et ferme. ce petit bout de code oblige l'utilisateur à appuyer sur une touche comme indiqué dans la fenêtre console avant de passer à la suite des instructions. on peut aussi mettre getch() comme un barbare, c'est pas fait pour ca mais aucun message ne s'affiche. (include conio.h il me semble)

si ca ne change rien, montre nous ton code et précise les déroulement visuel que tu obtiens.

Loki
0
gamemonde Messages postés 336 Date d'inscription samedi 9 août 2003 Statut Membre Dernière intervention 9 juillet 2011 2
24 avril 2007 à 11:46
le probleme a été corrigé. sous linux est-ce que system pause fonctionne aussi?
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
24 avril 2007 à 11:50
j'ai oublié, si tu trouves que ton affichage a du retard à l'allumage, c'est parce que cout<> un peu partout qui forçaient le vidage du tampon de sortie (sauf erreur de ma part)

Loki
0
Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
24 avril 2007 à 11:55
très bonne question gamemonde,

tout ce que je sais c'est que la fonction system() sert à appeler des instructions qu'on voudrait normalement taper directement dans le shell windows comme pause, cls ...
si l'instruction pause existe dans le shell linux pourquoi pas, sinon peut-être y a t'il un équivalent.

Loki
0
Rejoignez-nous