Maison  >  Article  >  Java  >  Comment générer des valeurs BigInteger aléatoires uniformément distribuées dans une plage spécifique en Java ?

Comment générer des valeurs BigInteger aléatoires uniformément distribuées dans une plage spécifique en Java ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-25 02:46:02810parcourir

How to Generate Uniformly Distributed Random BigInteger Values within a Specific Range in Java?

Génération de valeurs BigInteger aléatoires en Java

En Java, générer des entiers aléatoires dans une plage spécifiée peut être difficile lorsqu'il s'agit de grands nombres. Le problème se pose lors de l'utilisation de méthodes conventionnelles telles que nextDouble() pour la génération de nombres aléatoires, car les valeurs générées peuvent ne pas être uniformément distribuées au-delà de la limite de 253.

Utilisation du constructeur BigInteger

Pour résoudre ce problème, la classe BigInteger fournit un constructeur qui permet la création de valeurs BigInteger aléatoires uniformément réparties dans une plage de bits spécifiée.

Construit le constructeur BigInteger :

<code class="java">public BigInteger(int numBits, Random rnd)</code>

Ce constructeur prend deux paramètres :

  • numBits : Spécifie le nombre de bits pour la valeur générée
  • rnd : Un objet aléatoire utilisé pour générer des valeurs aléatoires

Générer une valeur aléatoire dans une plage

Pour générer une valeur aléatoire dans une plage plage non-puissance de 2 de 0 à n (inclus), une boucle peut être utilisée :

<code class="java">BigInteger randomNumber;
do {
    randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);</code>

Cette boucle itère jusqu'à ce qu'une valeur aléatoire valide soit obtenue. Il garantit que la valeur générée est uniformément répartie dans la plage spécifiée.

Optimisation du nombre d'itérations

Pour réduire le nombre d'itérations de boucle, une solution plus raffinée peut être appliquée .

<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>

Cette approche inclut une limite sur le nombre d'itérations pour éviter une exécution excessive de boucle. Il équilibre vitesse et précision, réduisant ainsi la probabilité d'un grand nombre d'itérations.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn