Puisqu'il s'agit de remapper une distribution uniforme à une autre avec une plage différente, ce n'est pas une question PHP spécifiquement bien que j'utilise PHP.Conserver une distribution uniforme après le remappage vers une nouvelle plage
J'ai un générateur de nombres aléatoires sécurisé cryptographiquement qui me donne des nombres entiers répartis uniformément (distribution discrète uniforme) entre 0
et PHP_INT_MAX
.
Comment remapper ces résultats pour les adapter à une plage différente d'une manière efficace?
Actuellement, je me sers $mappedRandomNumber = $randomNumber % ($range + 1) + $min
où $range = $max - $min
, mais que le travail ne obvioulsy pas depuis les premiers PHP_INT_MAX%$range
entiers de la gamme ont une plus grande chance d'être choisi, rompant l'uniformité de la distribution.
Merci pour la réponse, mais je suis tout peur impliquant des flotteurs entraînera des problèmes en raison de problèmes de représentation flottante des points et des erreurs d'arrondi. En outre, l'utilisation de maths 64 bits implique PHP_INT_MAX = 2^63 - 1, donc il y a aussi le problème de débordement. – NotGaeL
Non, par rapport à float j'ai spécifiquement dit mentalement, l'expression finale est tout entier. Wrt 'En outre, en utilisant 64 bits mathématiques implique PHP_INT_MAX = 2^63 - 1, donc il y a aussi le problème de débordement», pourriez-vous utiliser maths 64 bits seulement pour les intermédiaires? Encore une fois, je n'ai aucune idée à propos de PHP, mais je ne fais que calculer en accolades avec des maths 64 bits, et ensuite la division devrait fonctionner. –
ouais mais vous pouvez voir (max-min)/PHP_INT_MAX sera toujours un float et il n'y a pas d'autre moyen de faire le calcul sans débordement (faire 'r * (max - min)' premier débordera dans tous les cas, mais trivial) – NotGaeL