-
Probléme avec RAND_MAX
Bonjour,
J'utilise GNU gcc sous linux et windows
Sous linux j'ai RAND_MAX 2147483647
Alors que sous windows ou j'utilise MinGW j'ai RAND_MAX=32767
C'est vraiment un probléme pour moi parce que n'est pas le même comportement de mon code d'un systéme à l'autre
Comment puis-je harmoniser mes codes
Merci d'avance de votre aide
-
Si tu veux faire du sérieux et portable, je te conseille [boost/std]::random.
Elle peut paraître grosse au début, mais le programme d'exemple sur la page http://www.boost.org/doc/libs/1_48_0...st_random.html suffit généralement (avec en plus éventuellement la fonction seed pour reproduire la même séquence)
-
Merci de votre suggestion, mais à la base j'ai juste besoin d'une sequence de 10 nombres différent et aléatoires. Je ne cherche pas des choses trés sofistiqués mais portable sous linux, mac et windows. Alors m'installer boost sur ces 3 platformes me parait trop lourd simplement pour ca.
N'y a t -il pas moyen d'obliger par une option de compilation ou une directive à forcer le RAND_MAX en 16 bits. Je doute que l'on puisse faire changer celui de microsoft.
-
Bonjour,
Je doute que la valeur de RAND_MAX est vraiment une importance. Je m'explique.
Si sous Linux, la valeur est 2147483647 alors rand() retournera un nombre entre 0 et 2147483647.
Si sous Windows, la valeur est 32767 alors rand() retournera un nombre entre 0 et 32767.
Qu'est ce cela change ? Normalement rien. le résultat de rand()/static_cast<float>(RAND_MAX) sera toujours entre 0 et 1.
Par contre, si vous utilisez RAND_MAX pour une autre raison, vous aurez possiblement des problèmes.
La différence de valeur de RAND_MAX n'influera que sur la possible précision de la plage de valeur aléatoire. Mais bon, je pense que 1/32767, c'est déjà bien, non ?
Ou alors, votre problème existe car vous voulez toujours générer les mêmes nombres ?
-
Si ton compilo est récent, pas besoin de boost, c'est dans std::. Éventuellement, avec un compilo non récent mais pas trop vieux, std::tr1:: fourni aussi random. C'est dispo sous gcc comme sous visual C++.
Et dans le cas contraire boost, ce n'est pas si lourd à installer, surtout que boost.random peut être header only, même pas besoin de la compiler. Et puis, avec des vieux compilos, avoir boost d'installé pour suppléer, ça ne fait pas de mal :)
(LittleWhite : générer des nombres "aléatoires" prédéterminés et identiques d'une plateforme à l'autre peut simplifier des tests unitaires par exemple. Si c'est l'objectif, changer RAND_MAX ne résoudra rien, les algos sont probablement différents eux aussi...)
-
Merci de vos suggestion.
Une remarque: D'un point de vue général avoir un RAND_MAX de 32767 n'est pas du tout équivalent à avoir 2147483647. En particulier du point de vue de la périodicité.
Pour ma part, j'ai besoin d'otenir le même entier quelquesoit le systeme, donc je vais regarder du coté de boost comme suggéré.
Merci