srand() + orientage objet

srand() + orientage objet - C++ - Programmation

Marsh Posté le 15-05-2009 à 18:30:30    

Bonjour,
 
voilà j'ai un petit problème avec la fonction rand().
 
J'ai une classe dont une methode utilise rand() pour initialiser certains attributs. Mon problème est que les attributs sont toujours initialisés de la même façon. En effet, rand() me renvoie systematiquement les memes valeurs.
 
Or j'ai bien pensé a faire un srand(time(NULL)) au debut de mon programme. Je me suis dit que la construction des objets avait peut etre lieu avant l'appel à srand ce qui expliquerait le probleme, mais ce n'est pas le cas.
 
En gros dans main() j'ai
srand(time(NULL));
printf("MAIN : %i",rand()%50);
 
et dans ma methode :
printf("METHODE : %i",rand()%50);
 
J'obtiens dans la console dans cet ordre :
MAIN <un nombre toujours different>
METHODE <TOUJOURS LE MEME NOMBRE>
 
on dirait que le srand() dans le main n'a pas d'effet sur l'appel à rand() dans la methode. De plus, je suis sur Ubuntu. j'ai compilé sur un windows et je n'ai pas ce problème, le nombre genéré dans la methode est a chaque fois different...
 
Est-ce que quelqu'un a une idée ?
Je vous remercie  

Reply

Marsh Posté le 15-05-2009 à 18:30:30   

Reply

Marsh Posté le 15-05-2009 à 18:51:25    

deja tu apprendras que rand()%N ets atroce en terme de distribution.
Regarde du coté de boost::random pour des bonnes pratiques.

Reply

Marsh Posté le 15-05-2009 à 23:01:21    

Peut-être que rand()%N n'est pas très bon, mais il devrait quand même pas me sortir à chaque fois la même chose !

Reply

Marsh Posté le 17-05-2009 à 23:53:01    

Bizarre :s, si le code est pas trop compliqué, donne-le, je pourrais essayer de le compiler sur plusieurs environnements pour voir si ça se répète (windows xp, mac os x...) de ton coté, regarde si ça fait pareil sur d'autres versions et/ou d'autres distrib linux (si tu peux) mais c'est très bizarre comme problème ...


---------------
By bob.
Reply

Marsh Posté le 18-05-2009 à 17:16:03    

Merci pour ta proposition superbob, mais c'est du code qui fait parti d'un programme qui commence à être un peu gros (plusieurs dizaines de classes) et donc c'est pas possible de le passer. Par contre je garantis que ça n'arrive pas avec windows. Mais je n'ai pas pu essayer sur d'autres distrib que xubuntu.

Reply

Marsh Posté le 18-05-2009 à 17:23:37    

essaye de faire un sample minimal pour reproduire le problème, peut-être ?


---------------
last.fm
Reply

Marsh Posté le 18-05-2009 à 19:13:24    

Bah t'as qu'à juste compiler tes deux printfs et tu verra que ça marche très bien.

Reply

Marsh Posté le 21-05-2009 à 16:25:50    

N'aurais-tu pas un

Code :
  1. #ifndef _WIN32
  2. srand(0)
  3. #endif

quelque part avant ton appel de la méthode ?
Plus sérieusement, regarde si à certains endroits de ton code, tu as ou tu appelles des fonctions/methode qui pourraient faire des choses comme ça ...


---------------
By bob.
Reply

Sujets relatifs:

Leave a Replay

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