J'ai besoin d'une fonction qui permettrait de générer un entier aléatoire dans la plage donnée (y compris les valeurs limites). Je n'ai pas déraisonnable qualité/aléatoire exigences, j'ai quatre exigences:
- J'ai besoin d'elle pour être rapide. Mon projet doit générer des millions (ou parfois même des dizaines de millions) de nombres aléatoires et mon générateur de courant fonction s'est avérée être un goulot d'étranglement.
- J'ai besoin d'être raisonnablement uniforme (utilisation de rand() est parfaitement bien).
- le min-max va peut être quelque chose de <0, 1> à <-32727, 32727>.
- il doit être seedable.
J'ai actuellement de code C++ suivant:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Le problème, c'est qu'elle n'est pas vraiment uniforme - max est renvoyée uniquement lorsque rand() = RAND_MAX (pour Visual C++, il est 1/32727). C'est un grand problème pour les petites plages comme <-1, 1>, où la dernière valeur n'est presque jamais retourné.
J'ai donc pris la plume et du papier et est venu avec la formule suivante (qui s'appuie sur la (int)(n + 0.5) entier arrondissement truc):
Mais ça ne fonctionne toujours pas me donner une distribution uniforme. Répété fonctionne avec 10000 échantillons de me donner ratio de 37:50:13 pour les valeurs les valeurs -1, 0. 1.
Pourriez-vous proposer la meilleure formule? (ou le même ensemble de nombres pseudo-aléatoires générateur de fonction)