Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation

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
Lassé par la pub ? Créez un compte

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) )

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)

.... :|

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é...

#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 !

  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

#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"


}

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.

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

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

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......

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 !

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
Lassé par la pub ? Créez un compte
Tom's guide dans le monde