Dans les scénarios où la génération d'entiers aléatoires arbitrairement grands dans une plage spécifiée est nécessaire, une approche courante peut impliquer l'utilisation de nextDouble() et la multiplication la sortie par la limite souhaitée. Cependant, cette méthode devient problématique pour les valeurs supérieures à 2^53, conduisant à une distribution non uniforme.
Pour surmonter cette limitation, Java fournit la classe BigInteger, qui propose un constructeur qui génère des nombres aléatoires uniformément répartis entre 0 et (2^numBits - 1), inclus.
Pour générer une valeur aléatoire comprise entre 0 et n, où n n'est pas une puissance de 2, une simple boucle peut être utilisée :
<code class="java">BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);</code>
Cette approche itérative assure une répartition uniforme dans la plage souhaitée. En règle générale, seules une ou deux itérations sont nécessaires.
Pour les scénarios où le générateur de nombres aléatoires est coûteux en calcul, le nombre d'itérations dans la boucle peut être limité comme suit :
<code class="java">int nlen = upperLimit.bitLength(); BigInteger nm1 = upperLimit.subtract(BigInteger.ONE); BigInteger randomNumber, temp; do { temp = new BigInteger(nlen + 100, randomSource); randomNumber = temp.mod(upperLimit); } while (s.subtract(randomNumber).add(nm1).bitLength() >= nlen + 100);</code>
Il est très peu probable que cette version modifiée nécessite plusieurs itérations (probabilité inférieure à 2^100). Cependant, cela entraîne une pénalité de calcul en raison de l'opération mod(). Ainsi, il n'est recommandé que si le générateur de nombres aléatoires est particulièrement lent.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!