random en C++

random en C++ - C++ - Programmation

Marsh Posté le 07-06-2005 à 15:07:13    

Pourquoi lorsque j'utilise une de ces deux méthodes :  

Code :
  1. /*int essai1=0;
  2. essai1=(rand()%100);
  3. cout<<essai1<<endl;*/
  4. nb=(rand()%100)+1;
  5. cout<<nb<<endl;


 
Il me sort toujours le même nombre? Je sais qu'il y a une histoire de nombres pseudos aléatoires, et comment faire pour avoir un nombre différent à chaque fois??
 
Merci d'avance :jap:

Reply

Marsh Posté le 07-06-2005 à 15:07:13   

Reply

Marsh Posté le 07-06-2005 à 15:15:01    

Reply

Marsh Posté le 07-06-2005 à 15:18:16    

j'ai déjà cherché sur ce topic, il me met qu'il connait pas random, je dois inclure quelle bibliothèque?
 
Merci

Reply

Marsh Posté le 07-06-2005 à 15:18:35    

faut initialiser le seed avec srand(). Combine le avec la fonction time() pour avoir un seed totalement aleatoire.

Reply

Marsh Posté le 07-06-2005 à 15:19:11    

Aldarek a écrit :

j'ai déjà cherché sur ce topic, il me met qu'il connait pas random, je dois inclure quelle bibliothèque?
 
Merci


Citation :


SYNOPSIS
       #include <stdlib.h>
 
       int rand(void);
 
       int rand_r(unsigned int *seedp);
 
       void srand(unsigned int seed);


;)

Reply

Marsh Posté le 07-06-2005 à 15:20:46    

Aldarek a écrit :

j'ai déjà cherché sur ce topic


bein suffit pas de chercher, faut lire aussi

Reply

Marsh Posté le 08-06-2005 à 10:39:26    

J'ai remarqué quelque chose avec ce bout de code  

Code :
  1. srand ( time(NULL) );
  2. int nb_aleatoire;
  3. nb_aleatoire=(rand()%100)+1;
  4. cout<<nb_aleatoire<<endl;


 
C'est que le nombre aléatoire va toujours croissant, jusqu'à arriver à 100 pour ensuite repartire de 1 ou un autre nombre et croitre encore. En gros, il ne décroit jamais.
 
Auriez vous une solution à ce problème? Merci :jap:

Reply

Marsh Posté le 08-06-2005 à 10:56:30    

Reply

Marsh Posté le 08-06-2005 à 11:01:17    

[:pingouino]
 


madruk:~/Documents/dev/rand admin$ ./rand.test  
comparaison entre my_bad_rand et my_better_rand
nombre d'iterations (bigger is better) : 10000000
my_bad_rand moyenne : 0.358548
my_better_rand moyenne : 0.699694
my_bad_rand gagne !!! (plus aleatoire)


 
sur PPC G5 Mac OS X 10.4 gcc 3.4
 
des explications ? ca m'etonnes :|

Reply

Marsh Posté le 08-06-2005 à 11:17:17    

Déja, c'est une très mauvaise idée de générer des nombres aléatoires entre 1 et 100 (compris) en utilisant l'instruction " rand()%100)+1 ". Cela a déja été dit plusieurs fois sur ce forum.
 
Mathématiquement ce que tu me dis m'étonne. En plus, je viens de faire tourner ton programme et je n'ai pas ce comportement !

Reply

Marsh Posté le 08-06-2005 à 11:17:17   

Reply

Marsh Posté le 08-06-2005 à 12:44:50    

fe un  
 

Code :
  1. srandom (getpid ());


 
puis
 

Code :
  1. 1 + (random () % 99));


 
ca devrai marcher
en tout cas ca marche bien chez moi

Reply

Marsh Posté le 08-06-2005 à 12:45:23    

euh enleve les 1. g c pas ce que ca fout la

Reply

Marsh Posté le 08-06-2005 à 13:26:26    

shikra a écrit :

euh enleve les 1. g c pas ce que ca fout la


 
srandom() et random() sont des fonctions POSIX, ce qui signifie qu'elles ne sont pas forcément présentes sur tous les systèmes.
Contrairement à srand() et rand().

Reply

Marsh Posté le 08-06-2005 à 14:09:20    

Oui parce que quand je met random, il me dit qu'il connais pas...

Reply

Marsh Posté le 08-06-2005 à 16:03:57    

fait avec rand alor

Reply

Marsh Posté le 08-06-2005 à 20:57:47    

Joel F a écrit :

[:pingouino]
 


madruk:~/Documents/dev/rand admin$ ./rand.test  
comparaison entre my_bad_rand et my_better_rand
nombre d'iterations (bigger is better) : 10000000
my_bad_rand moyenne : 0.358548
my_better_rand moyenne : 0.699694
my_bad_rand gagne !!! (plus aleatoire)


 
sur PPC G5 Mac OS X 10.4 gcc 3.4
 
des explications ? ca m'etonnes :|

t'as essayé avec une grosse valeur pour N ?

Reply

Marsh Posté le 08-06-2005 à 21:01:44    

merde moi aussi. réfléchissons

Reply

Marsh Posté le 08-06-2005 à 21:07:17    

déjà, en mettant N pas une puissance de 2, les deux méthodes donnes de bien meilleurs résultats. après, my_better_rand gagne quand même la plus part du temps.

Reply

Marsh Posté le 08-06-2005 à 21:09:21    

ok :) :jap:

Reply

Marsh Posté le 08-06-2005 à 21:09:53    

et pourquoi pas boost::random ?? C'est mauvais ?

Reply

Marsh Posté le 08-06-2005 à 21:14:37    

y a un truc qui m'échappe. pour calculer la moyenne, je fais
 
somme( valeurs ) / (N * len(valeurs))
 
comment ça se fait que se truc soit pas toujours compris entre 0 et 1 ? y a peut etre tout simplement un problème d'overflow.  
 
testons en python (qui a des bigint)
 

Code :
  1. >>> import random
  2. >>> def bad(n): return random.randint(0, 2**16) % n
  3. ...
  4. >>> def better(n): return float(random.randint(0, 2**16)) / (1.0 + 2**16) * n
  5. ...
  6. >>> import operator
  7. >>> reduce(operator.add, [ bad(1983) for i in range(10000) ]) / (10000.0 * 1983.0)
  8. 0.49778804841149771
  9. >>> reduce(operator.add, [ better(1983) for i in range(10000) ]) / (10000.0 * 1983.0)
  10. 0.49930709980621529


 
better gagne

Reply

Marsh Posté le 08-06-2005 à 21:16:18    

enfin y pas tellement de différence que ça remarque. cela dit, avec N une puissance de 2, la différence est plus flagrante.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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