Double aléatoire

Double aléatoire - C++ - Programmation

Marsh Posté le 28-03-2006 à 09:09:15    

Bonjour à tous,
 
Je vous arrête desuite, j'ai déjà lu le topic parlant des nombre aléatoire en c++, mais, étant débutante, j'ai pas trop compri.
 
Je souhaiterai générer un double aléatoirement, j'ai essayé :

Code :
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. void main ()
  4. {
  5. double a;
  6. a = 2.0*rand() - (double) RAND_MAX;
  7. }


 
Mais ça m'affiche toujours un entier négatif.

Reply

Marsh Posté le 28-03-2006 à 09:09:15   

Reply

Marsh Posté le 28-03-2006 à 09:38:33    

à chaque fois que tu appelles rand(), ça te renvoie un nombre qui semble tiré alatoirement, mais qui en fait est généré à partir du nombre renvoyé par le précedent appel de rand(). (rand fonctionne sur le principe d'une suite pseudo-aléatoire)
 
finalement, toute ta suite de nombre pseudo-aléatoires retournée par les appels successifs de rand() est entièrement déterminée par le premier terme de la suite (la graine), qui est par défaut initialisé à 1. C'est pour ça que tu obtiens toujours le même résultat.
 
tu peux utiliser srand() pour choisir la graine et lui donner une valeur différente à chaque exécution. un moyen classique de faire est d'initialiser la graine avec l'heure d'exécution du programme, comme ça deux exécutions successives (à plus d'une seconde d'intervalle) ne donneront pas les mêmes résultats.
 
finalement, pour générer un double entre 0 et 1, ça donne quelque chose comme ça:
 

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main( ) // main renvoie toujours un entier
  5. {
  6.   srand( time(NULL) );
  7.   double a = rand() / (double)RAND_MAX;
  8.   std::cout << a << 'n';
  9.   return 0;
  10. }

Reply

Marsh Posté le 28-03-2006 à 09:50:03    

Merci, mais vu que je fais en fonction de l'heure, si je fais une boucle de ce style :

Code :
  1. for(int i=0;i<20;i++)
  2. {
  3. srand( time(NULL) );
  4. a = rand() / (double)RAND_MAX;
  5. cout << a <<endl;
  6. }


ça me renvoie toujours le même, normal vu que c'est la même heure, c'est bien ça ?
 
Mais moi je veux me servir de ce double pour remplir une matrice et là le problème c'est que ma matrice sera rempli d'un même nombre, et moi je les veux différents

Reply

Marsh Posté le 28-03-2006 à 10:55:15    

srand sert à initialiser la graine (un compteur utilisé par rand), si tu l'initialises à chaque tour de boucle avec un temps relatif en seconde (qui à de forte chance d'etre le meme d'une itération à l'autre) l'appel de rand te retournera le meme nombre.
faut mettre le srand à l'exterieur de la boucle, ou meme au début du programme.

Reply

Marsh Posté le 28-03-2006 à 11:02:59    

ah oui, nickel, merci. Et dernière question, comment je fais si je veux que ça varie entre -10 et 10 par exemple

Reply

Marsh Posté le 28-03-2006 à 11:08:06    

ben ça te renvoie quoi rand() ?

Reply

Marsh Posté le 28-03-2006 à 11:09:13    

des nombre entre 0 et 1

Reply

Marsh Posté le 28-03-2006 à 11:12:56    

et donc pour avoir un nombre entre 0 et 10 ?

Reply

Marsh Posté le 28-03-2006 à 11:14:23    

je sais pas...

Reply

Marsh Posté le 28-03-2006 à 11:20:08    

une multiplication par 10  [:pingouino] ?


Message édité par _darkalt3_ le 28-03-2006 à 11:20:34
Reply

Marsh Posté le 28-03-2006 à 11:20:08   

Reply

Marsh Posté le 28-03-2006 à 11:20:29    

oups... merci

Reply

Marsh Posté le 28-03-2006 à 11:21:51    

et pour qu'il soit aléatoirement négatif ?

Reply

Marsh Posté le 28-03-2006 à 11:22:57    

creuse toi la tete :o

Reply

Marsh Posté le 28-03-2006 à 11:25:45    

> ben ça te renvoie quoi rand() ?
> des nombre entre 0 et 1
mouais... entre 0 et RAND_MAX plutot...
 
donc pour un nombre de [0 à 1]:
double r=(double)rand()/(double)RAND_MAX;
 
0 <= r <= 1
0 <= r*20 <= 20
-10 <= r*20-10 <= 10
 
donc:
double r10=r*20-10;

Reply

Marsh Posté le 28-03-2006 à 11:27:23    

ok, merci

Reply

Marsh Posté le 28-03-2006 à 11:27:58    

Donne du poisson un jour à quelqu'un, il reviendra te demander à manger.
Apprends lui à pêcher et tu sera peinard.
 
(en gros ;) )

Reply

Marsh Posté le 28-03-2006 à 11:28:31    

exact....

Reply

Marsh Posté le 28-03-2006 à 11:28:40    

d une manière générale:

Code :
  1. // fonction qui renvoie un nombre dans [min,max]:
  2. double randd(double min, double max)
  3. {
  4.   double r=(double)rand()/(double)RAND_MAX;
  5.   return r*(max-min)+min;
  6. }


 

Reply

Marsh Posté le 28-03-2006 à 11:30:22    

> Donne du poisson un jour à quelqu'un, il reviendra te demander à manger.
Apprends lui à pêcher et tu sera peinard.
 
Je lui donne la méthode générale. Plus besoin de pêcher :)

Reply

Marsh Posté le 28-03-2006 à 11:31:30    

Pour moi, la méthode générale, c'est que les gens lisent la doc déjà [:spamafote]


Message édité par _darkalt3_ le 28-03-2006 à 11:36:29
Reply

Marsh Posté le 28-03-2006 à 11:35:48    

merci beaucoup pour ton aide

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed