J'ai besoin d'une fonction qui générerait un entier aléatoire dans une plage donnée (y compris les valeurs de bordure). Je n'ai pas d'exigences de qualité / aléatoire déraisonnables, j'ai quatre exigences:
- J'ai besoin que ce soit rapide. Mon projet doit générer des millions (voire des dizaines de millions) de nombres aléatoires et ma fonction de générateur actuelle s'est avérée être un goulot d'étranglement.
- J'ai besoin qu'il soit raisonnablement uniforme (l'utilisation de rand () est parfaitement bien).
- les plages min-max peuvent être n'importe quoi de <0, 1> à <-32727, 32727>.
- il doit pouvoir être semé.
J'ai actuellement le code C ++ suivant:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Le problème est qu'il n'est pas vraiment uniforme - max est renvoyé uniquement lorsque rand () = RAND_MAX (pour Visual C ++, il est 1/32727). C'est un problème majeur pour les petites plages telles que <-1, 1>, où la dernière valeur n'est presque jamais retournée.
J'ai donc pris un stylo et du papier et suis venu avec la formule suivante (qui s'appuie sur l'astuce d'arrondi entier (int) (n + 0.5)):
Mais cela ne me donne toujours pas une distribution uniforme. Des analyses répétées avec 10000 échantillons me donnent un rapport de 37:50:13 pour les valeurs -1, 0. 1.
Pouvez-vous suggérer une meilleure formule? (ou même fonction de générateur de nombres pseudo-aléatoires entiers)