Maison > Java > javaDidacticiel > ## 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
Libérer: 2024-10-25 07:18:29
original
376 Les gens l'ont consulté

## 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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal