Votre question

Problème pour générer un nombre aléatoire en c++

Tags :
  • Time
  • Programmation
Dernière réponse : dans Programmation
20 Avril 2007 20:25:53

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 nombres qu'au premier et idem pour le troisième. Je vous mets le début du programme




#include <iostream>
#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 :" <<a<<" dé2 :" <<b<<" dé3 :" <<c<<" dé4 :" <<d<<" dé5 :" <<e ;
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;}

//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 :" <<a<<" dé2 :" <<b<<" 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 :" <<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

Autres pages sur : probleme generer nombre aleatoire

20 Avril 2007 21:02:29

oui,

ta fonction rand !

// Génération d'un nombre aléatoire en 1 et 3
// Pour obtenir entre 0 et 2, tu fais rand() % 3
int nb= rand() % 3 + 1;


ca
Citation :
return (int) (min + ((float) rand() / RAND_MAX * (max - min + 1)));
c'est bien trop compliqué..

je verrai plutot:
return (int) (min + rand() % (max - min) )
20 Avril 2007 22:07:07

merci j'ai essayé mais le problème reste le même
Contenus similaires
21 Avril 2007 09:32:52

Attention à ton code .....

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)

if(de1 == false)
if(de2 == false)

.... :|
21 Avril 2007 09:46:29

Euh..... dsl mais l'anglais c'est pas mon point fort même avec le dicco
j'ai du mal :pt1cable: 
En gros ça dit quoi en français ? :ange:  Merci
21 Avril 2007 10:08:20

Etoiline a dit :
Euh..... dsl mais l'anglais c'est pas mon point fort même avec le dicco
j'ai du mal :pt1cable: 
En gros ça dit quoi en français ? :ange:  Merci



up car j'ai édité mon message précédent.

Du coup, sur mon nunux , ca marche mieux!
Erreur de code pour 2eme et 3eme lancé...
21 Avril 2007 10:20:44

#include <iostream>
#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 :" <<a<<" dé2 :" <<b<<" 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 :" <<a<<" dé2 :" <<b<<" 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 :" <<a<<" dé2 :" <<b<<" dé3 :" <<c<<" dé4 :" <<d<<" dé5 :" <<e ;
}

Voilà ça donne bien ça ? Merci de m'avoir fait remarqué cette erreur
mais ça reste pareil :cry:  :cry:  :cry:  toujours le même problème !
21 Avril 2007 11:13:26

  1. int hasard(int min, int max,int prec)
  2. {
  3. srand(time(NULL)+100*prec);
  4. int nb;
  5. nb= rand() % max + min ;
  6. return nb;
  7. }
  8.  
  9. int main ()
  10. { int a, b, c, d, e, i, n, p ;
  11. int vect[5];
  12. bool de1, de2, de3, de4, de5 ;
  13. int min = 1;
  14. int max = 6;
  15. int t;
  16. char lu[10];
  17. //premier lancer
  18. a=hasard(min, max,1);
  19. b=hasard(min, max,a);
  20. c=hasard(min, max,b);
  21. d=hasard(min, max,c);
  22. e=hasard(min, max,d);


ET
  1. n=0;
  2. while (n!=-1)
  3. {
  4. gets(lu);
  5. n=atoi(lu);
  6. if (n==1)
  7. de1=true;
  8. if (n==2)
  9. de2=true;
  10. if (n==3)
  11. de3=true;
  12. if (n==4)
  13. de4=true;
  14. if (n==5)
  15. de5=true;
  16. }



resultat:
  1. [manuel@manulinux src]$ ./float
  2. dé1 :3 dé2 :6 dé3 :6 dé4 :6 dé5 :6
  3. 1:Quels dés voulez-vous garder ? Puis taper -1-1
  4.  
  5. 2:dé1 :4 dé2 :6 dé3 :2 dé4 :5 dé5 :2
  6. 2:Quels dés voulez-vous garder ? Puis taper -1
  7. -1
  8.  
  9. 3:dé1 :3 dé2 :2 dé3 :2 dé4 :2 dé5 :2
21 Avril 2007 11:31:37

Yes ça marche merci beaucoup

21 Avril 2007 11:52:57

J'ai un autre problème quand j'exécute mon programme il s'arrête au bout du deuxième lancer et ne m'affiche pas les résultats du troisième
21 Avril 2007 12:02:32

montre la fin de ton code ..
21 Avril 2007 12:05:22

#include <iostream>
#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);
e=hasard(min, max, d);
de1=false;
de2=false;
de3=false;
de4=false;
de5=false;
cout<<"dé1 :" <<a<<" dé2 :" <<b<<" 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)
{ gets(lu);
n=atoi(lu);
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, 1);
if (de2==false)
b=hasard(min, max, a);
if (de3==false)
c=hasard(min, max, b);
if (de4==false)
d=hasard(min, max, c);
if (de5==false)
e=hasard(min, max, d);
cout<<"dé1 :" <<a<<" dé2 :" <<b<<" 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)
{ gets(lu);
n=atoi(lu);
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, 1);
if (de2==false)
b=hasard(min, max, a);
if (de3==false)
c=hasard(min, max, b);
if (de4==false)
d=hasard(min, max, c);
if (de5==false)
e=hasard(min, max, d);
cout<<"dé1 :" <<a<<" dé2 :" <<b<<" dé3 :" <<c<<" dé4 :" <<d<<" dé5 :" <<e ;
vect[1]=a;
vect[2]=b;
vect[3]=c;
vect[4]=d;
vect[5]=e;


cout<<"Que voulez-vous faire ? \n As=1 \n Deux=2 \n Trois=3 \n Quatre=4 \n Cinq=5"


}

21 Avril 2007 12:08:14

tes cout :
à la fin, met << endl ; pour forcer l'affichage (retour chariot).


cout << "toto" << a << "|" << b << endl;
21 Avril 2007 12:11:37

ça marche pas
21 Avril 2007 12:16:36

cout<<"Que voulez-vous faire ? \n As=1 \n Deux=2 \n Trois=3 \n Quatre=4 \n Cinq=5"

un "<<endl;" c'est mieux non ?

Montre le résultat qui s'affiche sur ton écran (à l'execution).

ensuite, pour l'affichage des dé1: (...) , tu ferai mieux d'afficher le numero de lancé . Lancé1 : dé1= / Lancé2 : dé1= ......


Enfin,
dans ton programme, tu as surement un débugger: tu mets un point d'arrêt et tu exécute le programme en pas à pas . Tu verras où ça bloque.
21 Avril 2007 13:33:46

Tu sais je suis débutante alors je m'y connais pas trop.
Le endl il faut le mettre entre guillemets ? J'ai pas bien compris.
Quand je mets cout<<"..."<<a<<endl; ça me l'affiche toujours pas
ok merci pour les lancers je vais le faire
21 Avril 2007 17:12:32

Citation :

Montre le résultat qui s'affiche sur ton écran (à l'execution).

ensuite, pour l'affichage des dé1: (...) , tu ferai mieux d'afficher le numero de lancé . Lancé1 : dé1= / Lancé2 : dé1= ......


alors ?
21 Avril 2007 18:07:27

En fait j'ai essayer de faire "exécuter jusqu'au curseur" en mettant le curseur à la fin et bizarrement maintenant ça marche....
En tout cas merci j'ai pas pigé pourquoi maintenant ça marche et pas avant mais bon ça fonctionne c'est l'essentiel
21 Avril 2007 19:46:53

Etoiline a dit :
En fait j'ai essayer de faire "exécuter jusqu'au curseur" en mettant le curseur à la fin et bizarrement maintenant ça marche....
En tout cas merci j'ai pas pigé pourquoi maintenant ça marche et pas avant mais bon ça fonctionne c'est l'essentiel



non, ce n'est pas l'essentiel. Si tu n'as pas compris pourquoi, alors tout ça ne sert à STRICTEMENT rien!


reprends ton algo, et essaye de comprendre là ou tu T'est plantée.

dans ce cas précis, il s'agit d'un programme de 20 lignes. si tu ne comprends pas pourquoi ça ne faisait pas ce que tu voulais, imagines quand tu auras (et je peux dire ça par expérience) un source de 50 000 lignes......
21 Avril 2007 21:34:38

Oui je reconnais que t'as raison mais comme je suis débutante j'ai cliqué un peu partout donc j'ai sans doute débloquer le truc sans le savoir.

Par contre j'ai un autre problème (et oui décidément j'ai que ça :(  ) :

J'ai mis toutes les valeurs dans un vecteur et je voudrais les trier donc j'ai écrit :
vect[1]=a;
vect[2]=b;
vect[3]=c;
vect[4]=d;
vect[5]=e;

for (i==1; i==4; i++)
{for (j==i; j==5; j++)
{if (vect>vect[j])
{temp=vect;
vect=vect[j];
vect[j]=temp;}
}
}

sauf que ça ne trie rien du tout !
21 Avril 2007 21:40:33

Etoiline a dit :
Oui je reconnais que t'as raison mais comme je suis débutante j'ai cliqué un peu partout donc j'ai sans doute débloquer le truc sans le savoir.

Par contre j'ai un autre problème (et oui décidément j'ai que ça :(  ) :

J'ai mis toutes les valeurs dans un vecteur et je voudrais les trier donc j'ai écrit :
vect[1]=a;
vect[2]=b;
vect[3]=c;
vect[4]=d;
vect[5]=e;

for (i==1; i==4; i++)
{for (j==i; j==5; j++)
{if (vect>vect[j])
{temp=vect;
vect=vect[j];
vect[j]=temp;}
}
}

sauf que ça ne trie rien du tout !



Déjà, quand tu fais du tri comme ça, il faut toujours utiliser une variable temporaire de stockage.
trier un tableau dans lui même ne te ménera à rien...
sinon,regardes plutôt dans les fonctions sort.

http://www.cplusplus.com/reference/algorithm/sort.html


au fait,
un "petit site" qui t'aidera à chercher:
http://www.cplusplus.com
21 Avril 2007 22:05:58

merci pour le petit site ;)  j'ai trouvé
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS