Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/09/2009, à 01:46

obiwankennedy

Utilisation du modulo dans du tirage aléatoire entre deux valeurs.

Bonjour, j'ai repris le developpement d'un logiciel qui contient un tirage aléatoire.
(c'est du C++)
Voici la ligne :

resultat = rand()%max + 1;

On cherche des valeurs entre 1 et max.


Un utilisateur m'a dit qu'il avait remarqué des problèmes dans cette génération. Il a lu qu'il ne fallait pas utiliser le modulo mais plutôt une ligne comme ceci:

int nombre = 1 + (int)((double)rand() / ((double)RAND_MAX + 1) * max);

Je comprends ce que fait cette ligne mais je vois pas en quoi c'est "plus mieux" que la première.  Il joue avec le passage en double (0 <= x < 1) pour avoir plus de "détails".

La différence est-elle vraiment notable ?  Sachant que max n'est pas un nombre très grand (~ 20 voir moins).
J'ai fait des tests sur 1000 valeurs, j'ai pas vu de grosses différences dans les courbes.

Dernière modification par obiwankennedy (Le 15/09/2009, à 21:10)


Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam

Hors ligne

#2 Le 15/09/2009, à 19:55

Link31

Re : Utilisation du modulo dans du tirage aléatoire entre deux valeurs.

Tu ne remarqueras pas de différence sous GNU/Linux, parce que le "problème", causé par une différence d'entropie entre les bits de poids faible et les bits de poids fort, a été corrigé.

Cependant, certaines vieilles implémentations de rand(), voire certains système d'exploitation mal conçus, peuvent encore présenter ce défaut, d'où l'intérêt dans ce cas de n'utiliser que les bits de poids fort comme le fait ton deuxième bout de code.

Hors ligne