fontion rand en c++

fontion rand en c++ - C++ - Programmation

Marsh Posté le 23-10-2001 à 08:15:42    

je cherche a faire une fontion random entre 1 et la valeur dans une variable
 
faut que je fasse quoi comme code ?


---------------
COMPTE LOD HC : hfr_belgarion2
Reply

Marsh Posté le 23-10-2001 à 08:15:42   

Reply

Marsh Posté le 23-10-2001 à 21:38:27    

int nb;
 
nb=random();
 
while ((nb<1) || (nb>valeur))
{
nb=random();
}

 

[edtdd]--Message édité par corvincent--[/edtdd]

Reply

Marsh Posté le 23-10-2001 à 21:39:24    

corvincent a écrit a écrit :

int nb;
 
nb=random();
 
while ((nb<1) || (nb>valeur))
{
nb=random();
}  
 
 



Reply

Marsh Posté le 23-10-2001 à 22:04:20    

j'ai plus court
 
nb=(random()%valeur)+1;
 
 
le compte est bon....


---------------

Reply

Marsh Posté le 06-03-2002 à 00:50:01    

Je pense avoir mieux...
 
int nb;
nb = ((rand()/RAND_MAX) * (valeur_dans_ta_variable-1)) +1;
 
 
Explication:
rand() te fourni un nombre aléatoire avec comme borne supérieure RAND_MAX (définie je ne sais où, soit).
 
Bref, le principe est de diviser un nombre aléatoire par RAND_MAX afin d'obtenir un nombre compries entre 0 et 1 (compris => intervalle [0,1]).
Ensuite, il ne te reste plus qu'à multiplier cette valeur par le nombre aléatoire maximum désiré (ici valeur_dans_ta_variable).
 
L'intérête d'utiliser cette méthode est que le côté pseudo aléatoire est un peu atténué...
euh... je ne sais pas si je me fais comprendre...  
Pour faire cours, c'est mieux ;).
 
 
Si tu as régulièrement besoin de nombres aléatoire dans ton code, fais ceci:
 
#define RAND_NUM (rand()/RAND_MAX)
 
Puis, pour un nombre aléatoire compris entre 0 et x, faire:  nb = RAND_NUM * x;

Reply

Marsh Posté le 06-03-2002 à 00:51:36    

LOL
 
:pt1cable:  Désolé, je viens seulement de remarquer la date  :pt1cable:

Reply

Marsh Posté le 05-01-2003 à 18:39:45    

Majca Jalasu a écrit :

LOL
 
:pt1cable:  Désolé, je viens seulement de remarquer la date  :pt1cable:  

et bien je suis très content que tu sois qd meme donné cette peine, ça me sert !
 
 
merci bcp :jap:


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 05-01-2003 à 18:54:18    

la méthode de Majca Jalasu est presque bonne mais ne fonctionnera jamais car elle mets en oeuvre la division entier. comme rand() renvoie un entier entre 0 et RAND_MAX, rand()/RAND_MAX vaudra toujours 0  
 
voilà un bonne usage de rand() pour de meilleur nombres pseudo aléatoire: ces 2 implémentatiosn présentent 2 fonctions my_bad_rand qui est communément utilisée à tort, et my_better_rand qui est meilleur et moins limitée)
 
 
[C++] http://dejean.benoit.free.fr/rand.cpp.html
(peut etre un peu plus compliquée, si vous ne la comprenez pas, jetez un oeil à la version C)
 
[C] http://dejean.benoit.free.fr/rand.c.html


Message édité par Taz le 05-01-2003 à 18:59:20
Reply

Marsh Posté le 05-01-2003 à 19:57:57    

ces fonctions sont ds le domaine public ?  :ange:


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 05-01-2003 à 20:27:19    

sseb22 a écrit :

ces fonctions sont ds le domaine public ?  :ange:  

leur code oui, pas elles memes: personne ne peut se les approprier  :D

Reply

Marsh Posté le 05-01-2003 à 20:27:19   

Reply

Marsh Posté le 05-01-2003 à 20:33:23    

Citation :

la méthode de Majca Jalasu est presque bonne mais ne fonctionnera jamais car elle mets en oeuvre la division entier. comme rand() renvoie un entier entre 0 et RAND_MAX, rand()/RAND_MAX vaudra toujours 0  

tu as raison mais si on veut tout de meme utiliser cette fonction il suffit de faire un cast sur RAND_MAX (qui est un entier apparemment)
 
 

Code :
  1. nb = rand()/((double)RAND_MAX);

là, c bon


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 06-01-2003 à 01:18:10    

Majca Jalasu a écrit :

LOL
 
:pt1cable:  Désolé, je viens seulement de remarquer la date  :pt1cable:  


 
je comprends qd tuy as û repondre a ce poste  
tu remontes de tps en tps jusqu'a la page 15 lol
non en fait je pense ke t'a fait une recherche sur quelque chose et tu es tomber dessus

Reply

Marsh Posté le 11-10-2003 à 14:03:52    

Je ne parviens pas à utiliser rand() comme il faut...
Pouvez-vous m'expliquer ce que je n'ai pas capté please ?
 

Code :
  1. a = (int)(10.0 * rand() / RAND_MAX);


Dans ce cas ca me sort 0 à chaque fois que je lance le prog.
 

Code :
  1. b = ((rand() /RAND_MAX)* (d-1))+1 ;


Et dans ce cas, il me sort logiquement 1 à tous les coups.  
 
Pour mon exo de génération aléatoire des opérandes, on me dit de faire:

Code :
  1. #include <stream.h>
  2. #include <stdlib.h>
  3. int genOperande(int max)
  4. {
  5. int a;
  6. a = (int) (max * rand() /RAND_MAX);
  7. return (a);
  8. }
  9. void main()
  10. {
  11. int a;
  12. a = genOperande(9);
  13. cout << a << endl;
  14. }


Ca me sort encore des 0.  
Je ne comprend pas car j'ai pris le code complet d'un pote (exo de calcul mental avec menu et génération aléatoire d'opérandes): ca compile et marche bien.  
Si je prend seulement le bout du dessus ca ne marche pas. Et je ne vois pas dans le code complet ce qui peut faire fonctionner.
 


---------------
Profil D3 Florent#2683
Reply

Marsh Posté le 11-10-2003 à 14:07:56    

deja faut faire un srand(toto), avec toto une variable changeant a chaque execution (au hasard : l'heure)
ensuite si j'etais toi, je ferais plus ca :
 

Code :
  1. a = (int) ((float)max  * ((float)rand() /(float)RAND_MAX));


 
ca evitera de possible overflows


Message édité par chrisbk le 11-10-2003 à 14:08:06
Reply

Marsh Posté le 11-10-2003 à 14:14:15    

Lol ce topic a 3 ans ca m'etonnerait que son auteur soit encore la ...  
[:rofl]


---------------
Human Forever
Reply

Marsh Posté le 11-10-2003 à 14:15:03    

ben je reponds a pwill hein ? :o
 
et 2003-2001 ca fait pas 3 :o

Reply

Marsh Posté le 11-10-2003 à 14:32:07    

Oui chrisbk, je vais tester, je suis vraiment débutant en C++ en tp ils ne détaillent pas toujours les détails  :whistle:  
 
En tout cas ce topik m'a évité d'en refaire un sur le même sujet, et m'a fait comprendre quelques trucs déjà  :kaola:  
Que l'auteur soit la ou pas ou est le pb ?  :heink:  


---------------
Profil D3 Florent#2683
Reply

Marsh Posté le 11-10-2003 à 14:39:35    

aucun pb, VisualC_n3T n'est de toute facon pas digne d'interet :o

Reply

Marsh Posté le 11-10-2003 à 15:00:45    

Code :
  1. #include <stream.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int genOperande(int max)
  5. {
  6. srand( (unsigned) time( NULL ));
  7. int a;
  8. a=(int) ((float)max * (float)rand() / (float)RAND_MAX);
  9. return a;
  10. }
  11. void main()
  12. {
  13. int a;
  14. a = genOperande(2);
  15. cout << a << endl;
  16. }


Ca me donne pas vraiment un aléatoire... il me renvoie toujours le même entier après 15 essais :(  
Normalement c'est censé fonctionner sans srand.


---------------
Profil D3 Florent#2683
Reply

Marsh Posté le 11-10-2003 à 15:05:25    

nope !!!
le srand tu le fais UNE FOIS en debut de programme et c tout

Reply

Marsh Posté le 11-10-2003 à 15:42:13    

chrisbk a écrit :

nope !!!
le srand tu le fais UNE FOIS en debut de programme et c tout


 
Désolé mais je ne comprend pas, en 4 semaines de cours, autant dire qu'on a pas fait grand chose hein. Ca fait quoi un srand() ?
 
Sinon dans le tp on me disait simplement d'utiliser l'instruction

Code :
  1. a = (int) (max * rand() / RAND_MAX)


---------------
Profil D3 Florent#2683
Reply

Marsh Posté le 11-10-2003 à 15:48:23    

initialise la graine servant au pseudo aleatoire, cf msdn, google & cie (pas le tps (ni l'envie) de developer)
 
 
 
 
 

Reply

Marsh Posté le 11-10-2003 à 15:59:41    

comme dans mes exemples ... sinon utilisez double toujours sauf si l'espace mémoire vous est précieux (je parle de plusiseurs centaines de Mo)

Reply

Marsh Posté le 11-10-2003 à 19:54:37    

chrisbk a écrit :

aucun pb, VisualC_n3T n'est de toute facon pas digne d'interet :o


 
Merci :jap:  
 
Est-ce que par hasard tu te sentirais plus digne d'interet que les autres ?  
 
 ;)  


---------------
Human Forever
Reply

Marsh Posté le 13-10-2003 à 08:49:15    

J'ai pas lu tout le topic (désolé), mais si ça peut aider, on peut trouver un générateur de nombre aléatoire en c++ assez bien fait ici: http://perso.club-internet.fr/ktd/index.html


Message édité par LetoII le 13-10-2003 à 08:49:47

---------------
Le Tyran
Reply

Marsh Posté le 13-10-2003 à 09:36:51    

boost :o

Reply

Marsh Posté le 24-01-2004 à 17:49:36    

VisualC_n3t a écrit :

Lol ce topic a 3 ans ca m'etonnerait que son auteur soit encore la ...  
[:rofl]

c pas grave, ça sert tjs :)


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 24-01-2004 à 22:43:41    

boost.random
www.boost.org
 
un petit exemple :

Code :
  1. boost::minstd_rand generator(static_cast<unsigned int>(std::time(0)));
  2. boost::uniform_int<boost::minstd_rand, int> uni(generator, 1, 15); // entre 1 et 15
  3. int nb = uni();


Message édité par blackgoddess le 24-01-2004 à 22:44:02
Reply

Marsh Posté le 25-01-2004 à 00:45:17    

sseb22 a écrit :

c pas grave, ça sert tjs :)


 
C'est quoi ces déterrages successifs ? :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-01-2004 à 11:17:43    

plains toi à joce :o
g un drapeau, j'y rentre


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 26-01-2004 à 11:20:22    

Si t'avais un drapeau pour un si vieux topic, c'est que tu ne postes pas assez :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-01-2004 à 17:05:54    

c clair que HFR n'est plus mon forum principal depuis lgtps


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 26-01-2004 à 20:53:00    

root tha nutz :ange:


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 28-01-2004 à 16:46:05    

amen to that, my man !


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
Reply

Marsh Posté le 05-09-2004 à 19:42:13    

Merci ! Ca sert (encore) et toujours !
(maintenant, plus qu'à trouver pkoi ce c** reconnais pas cout ^^)
 
Wiiip - je creuse, tu creuses ...

Reply

Marsh Posté le 05-09-2004 à 20:57:33    

std::cout :o

Reply

Marsh Posté le 06-09-2004 à 13:07:53    

oui ça sert !

Reply

Marsh Posté le 10-04-2005 à 13:02:06    

Redeterrage ! :p
Bon voila, jsuis tombé sur ce topic grace a Google...mais cest bien, comme ça au moins on accumule des informations...
et jai un probleme. Je narrive pas a trouver un nombre aleatoire sous forme de float compris entre -1 et 1...avez vous une piste, comment pourrais je faire ?  
 
En fait ce que je fais en ce moment : boule[i].posx = (float)rand()/ 35000;
fonctionne mais (je fais de la 2D) mes boules ne se situent que dans la partie haut-droite de mon ecran. Normal donc.
 
Commet obtenir un float dans lintervale [-1; 1] ?
 
Merci !
:)


Message édité par coincoin1307 le 10-04-2005 à 13:18:33
Reply

Marsh Posté le 10-04-2005 à 13:27:46    

ouais alors là, c'est un peu plus serré.
Prendre un [0; 2] et décalé de -1 serait une erreur à cause du format des float. Je serais plus pour tirer un float sur [0; 1] et refaire un tirage pour le signe. Le mieux serait quand même d'utiliser un générateur capable de fournir une plus grande quantité de bits.
 
et les trucs genre read(... &mon_float, sizeof mon_float ...) où on serait tenté de remplir brutalement un float, ça ne marche pas car on pourrait obtenir une représentation non valide.

Reply

Marsh Posté le 10-04-2005 à 13:40:14    

Code :
  1. def random(self):
  2.         """Get the next random number in the range [0.0, 1.0)."""
  3.         # Wichman-Hill random number generator.
  4.         #
  5.         # Wichmann, B. A. & Hill, I. D. (1982)
  6.         # Algorithm AS 183:
  7.         # An efficient and portable pseudo-random number generator
  8.         # Applied Statistics 31 (1982) 188-190
  9.         #
  10.         # see also:
  11.         #        Correction to Algorithm AS 183
  12.         #        Applied Statistics 33 (1984) 123
  13.         #
  14.         #        McLeod, A. I. (1985)
  15.         #        A remark on Algorithm AS 183
  16.         #        Applied Statistics 34 (1985),198-200
  17.         # This part is thread-unsafe:
  18.         # BEGIN CRITICAL SECTION
  19.         x, y, z = self._seed
  20.         x = (171 * x) % 30269
  21.         y = (172 * y) % 30307
  22.         z = (170 * z) % 30323
  23.         self._seed = x, y, z
  24.         # END CRITICAL SECTION
  25.         # Note:  on a platform using IEEE-754 double arithmetic, this can
  26.         # never return 0.0 (asserted by Tim; proof too long for a comment).
  27.         return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0


 
tiré des sources du module random de python. Cette algorithme à l'air très intéressant. Je pense que tu peux le reprendre tel quel. La graine est un triplet. Reste le problème du signe.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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