Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1678 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  fontion rand en c++

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

fontion rand en c++

n°67022
belgarion_​cer
Posté le 23-10-2001 à 08:15:42  profilanswer
 

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
mood
Publicité
Posté le 23-10-2001 à 08:15:42  profilanswer
 

n°67268
corvincent
Posté le 23-10-2001 à 21:38:27  profilanswer
 

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

 

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

n°67269
corvincent
Posté le 23-10-2001 à 21:39:24  profilanswer
 

corvincent a écrit a écrit :

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



n°67276
flo850
moi je
Posté le 23-10-2001 à 22:04:20  profilanswer
 

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


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

n°108087
Majca Jala​su
Posté le 06-03-2002 à 00:50:01  profilanswer
 

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;

n°108088
Majca Jala​su
Posté le 06-03-2002 à 00:51:36  profilanswer
 

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

n°279698
sseb22
It is an awful waste of space
Posté le 05-01-2003 à 18:39:45  profilanswer
 

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
n°279705
Taz
bisounours-codeur
Posté le 05-01-2003 à 18:54:18  profilanswer
 

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
n°279750
sseb22
It is an awful waste of space
Posté le 05-01-2003 à 19:57:57  profilanswer
 

ces fonctions sont ds le domaine public ?  :ange:


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
n°279756
Taz
bisounours-codeur
Posté le 05-01-2003 à 20:27:19  profilanswer
 

sseb22 a écrit :

ces fonctions sont ds le domaine public ?  :ange:  

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

mood
Publicité
Posté le 05-01-2003 à 20:27:19  profilanswer
 

n°279758
sseb22
It is an awful waste of space
Posté le 05-01-2003 à 20:33:23  profilanswer
 

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
n°279849
weed
Posté le 06-01-2003 à 01:18:10  profilanswer
 

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

n°537000
Pwill
Deux fois Né
Posté le 11-10-2003 à 14:03:52  profilanswer
 

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
n°537006
chrisbk
-
Posté le 11-10-2003 à 14:07:56  profilanswer
 

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
n°537011
VisualC_n3​T
Boolays élevés au grain
Posté le 11-10-2003 à 14:14:15  profilanswer
 

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


---------------
Human Forever
n°537013
chrisbk
-
Posté le 11-10-2003 à 14:15:03  profilanswer
 

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

n°537026
Pwill
Deux fois Né
Posté le 11-10-2003 à 14:32:07  profilanswer
 

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
n°537033
chrisbk
-
Posté le 11-10-2003 à 14:39:35  profilanswer
 

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

n°537045
Pwill
Deux fois Né
Posté le 11-10-2003 à 15:00:45  profilanswer
 

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
n°537050
chrisbk
-
Posté le 11-10-2003 à 15:05:25  profilanswer
 

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

n°537089
Pwill
Deux fois Né
Posté le 11-10-2003 à 15:42:13  profilanswer
 

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
n°537093
chrisbk
-
Posté le 11-10-2003 à 15:48:23  profilanswer
 

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

n°537101
Taz
bisounours-codeur
Posté le 11-10-2003 à 15:59:41  profilanswer
 

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)

n°537231
VisualC_n3​T
Boolays élevés au grain
Posté le 11-10-2003 à 19:54:37  profilanswer
 

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
n°537852
LetoII
Le dormeur doit se réveiller
Posté le 13-10-2003 à 08:49:15  profilanswer
 

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
n°537890
Taz
bisounours-codeur
Posté le 13-10-2003 à 09:36:51  profilanswer
 

boost :o

n°620898
sseb22
It is an awful waste of space
Posté le 24-01-2004 à 17:49:36  profilanswer
 

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
n°621071
blackgodde​ss
vive le troll !
Posté le 24-01-2004 à 22:43:41  profilanswer
 

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
n°621107
antp
Super Administrateur
Champion des excuses bidons
Posté le 25-01-2004 à 00:45:17  profilanswer
 

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
n°621732
sseb22
It is an awful waste of space
Posté le 26-01-2004 à 11:17:43  profilanswer
 

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


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
n°621736
antp
Super Administrateur
Champion des excuses bidons
Posté le 26-01-2004 à 11:20:22  profilanswer
 

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
n°622065
sseb22
It is an awful waste of space
Posté le 26-01-2004 à 17:05:54  profilanswer
 

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


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
n°622254
Jubijub
Parce que je le VD bien
Posté le 26-01-2004 à 20:53:00  profilanswer
 

root tha nutz :ange:


---------------
Jubi Photos : Flickr - 500px
n°624008
sseb22
It is an awful waste of space
Posté le 28-01-2004 à 16:46:05  profilanswer
 

amen to that, my man !


---------------
Ma Carrière de Joueur : 114 pages, 25 ans, 1 PDF
n°842886
Wiiip
Pseudo-lurkeur
Posté le 05-09-2004 à 19:42:13  profilanswer
 

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

n°842912
Taz
bisounours-codeur
Posté le 05-09-2004 à 20:57:33  profilanswer
 

std::cout :o

n°843283
sseb22
It is an awful waste of space
Posté le 06-09-2004 à 13:07:53  profilanswer
 

oui ça sert !

n°1041866
coincoin13​07
Posté le 10-04-2005 à 13:02:06  profilanswer
 

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
n°1041893
Taz
bisounours-codeur
Posté le 10-04-2005 à 13:27:46  profilanswer
 

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.

n°1041909
Taz
bisounours-codeur
Posté le 10-04-2005 à 13:40:14  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  fontion rand en c++

 

Sujets relatifs
générateur de nombre aléatoire sous VC++ meilleur que rand ?[C] rand()
Plus de sujets relatifs à : fontion rand en c++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR