Quel est un remplacement approprié pour rand ()?

Autant que je sache, rand () ne génère pas une dissortingbution aléatoire uniforme. Quelle fonction / algorithme me permettra de le faire? Je n’ai pas besoin de chiffrement aléatoire, mais seulement d’une dissortingbution aléatoire uniforme. Enfin, quelles bibliothèques fournissent ces fonctions? Merci!

rand() génère une dissortingbution uniforme (pseudo-) aléatoire.

L’exigence actuelle de la norme C (3.7 Mo PDF), section 7.20.2.1, est la suivante:

La fonction rand calcule une séquence d’entiers pseudo-aléatoires compris entre 0 et RAND_MAX .

où RAND_MAX est égal à au moins 32767. C’est certes vague, mais l’objective est de vous donner une dissortingbution uniforme – et dans la pratique, c’est ce que les implémentations font.

La norme fournit un exemple d’implémentation, mais les implémentations C ne sont pas nécessaires pour l’utiliser.

En pratique, il existe certainement de meilleurs générateurs de nombres aléatoires. Et une exigence spécifique de rand() est qu’il doit produire exactement la même séquence de nombres pour une graine donnée (argument de srand() ). Votre description n’indique pas que cela poserait un problème pour vous.

Un problème est que rand() vous donne des nombres uniformément répartis dans une plage fixe. Si vous voulez des nombres dans une plage différente, vous devez faire un travail supplémentaire. Par exemple, si RAND_MAX est 32767, alors rand() peut produire 32768 valeurs distinctes; vous ne pouvez pas obtenir de nombres aléatoires compris entre 0 et 9 sans supprimer certaines valeurs, car il est impossible de répartir de manière égale ces 32 768 valeurs distinctes dans 10 tranches de tailles égales.

D’autres PRNG sont susceptibles de vous donner de meilleurs résultats que rand() , mais ils vont probablement être soumis aux mêmes problèmes.

Comme d’habitude, la FAQ comp.lang.c répond mieux que moi; voir les questions 13.15 à 13.21.

Voici un article et un générateur de nombre aléatoire autonome écrit en C #. Le code est très petit et facilement portable en C ++, etc.

Chaque fois que ce sujet est abordé, quelqu’un répond que vous ne devriez pas utiliser votre propre générateur de nombres aléatoires, mais que vous devriez laisser cela à des spécialistes. Je réponds que vous ne devriez pas proposer votre propre algorithme . Laissez cela aux spécialistes, car c’est vraiment très subtil. Mais c’est bien et même avantageux d’avoir votre propre implémentation. De cette façon, vous savez ce qui est fait et vous pouvez utiliser la même méthode dans plusieurs langues ou plates-formes.

L’algorithme décrit dans cet article est celui de George Marsaglia, l’un des meilleurs experts en génération de nombres aléatoires. Même si le code est minuscule, la méthode résiste bien aux tests standard.

La fonction BSD random() (incluse dans l’option XSI de POSIX / SUS) est presque universellement disponible et bien meilleure que rand sur la plupart des systèmes (à l’exception de certains où rand utilise réellement random et qu’ils sont donc très bons).

Si vous préférez sortir des bibliothèques système, voici quelques informations utiles sur vos choix:

http://guru.multimedia.cx/category/pseudo-random-number-generators/

(De Michael Niedermayer de FFmpeg.)

Eh bien, la question de savoir s’il existe ou non un générateur pseudo-aléatoire réel est toujours ouverte . Cela étant dit, une recherche rapide révèle qu’il peut exister des alternatives légèrement meilleures .