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

## Comment générer des valeurs BigInteger aléatoires dans une plage spécifique en Java ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 07:18:29285parcourir

## How do you generate random BigInteger values within a specific range in Java?

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

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.

Générer une valeur aléatoire dans une plage non puissance de 2

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.

Limitation des itérations dans la boucle

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!

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