Maison > Java > javaDidacticiel > Comment générer des BigIntegers aléatoires arbitrairement grands dans une plage spécifique en Java ?

Comment générer des BigIntegers aléatoires arbitrairement grands dans une plage spécifique en Java ?

Linda Hamilton
Libérer: 2024-10-25 01:02:30
original
583 Les gens l'ont consulté

How to Generate Arbitrarily Large Random BigIntegers in a Specific Range in Java?

Générer des BigIntegers aléatoires en Java

Question :

Comment générer des nombres aléatoires arbitrairement grands Valeurs BigInteger comprises entre 0 et n (hors n), où n n'est pas une puissance de 2 ?

Réponse :

Utiliser le constructeur de BigInteger qui prend un peu count et une instance d'un générateur aléatoire, vous pouvez créer de telles valeurs :

public BigInteger(int numBits, Random rnd)
Copier après la connexion

Cependant, pour obtenir des valeurs dans la plage souhaitée, il est nécessaire d'utiliser une boucle :

BigInteger randomNumber;
do {
    randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);
Copier après la connexion

En moyenne, cette boucle fonctionne en moins de deux itérations, garantissant une distribution uniforme.

Edit :

Pour les situations où le générateur aléatoire est gourmand en performances, vous pouvez implémentez l'approche suivante :

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

Bien que cette méthode réduise considérablement la probabilité d'itérations de boucles multiples (moins d'une chance sur 2^100), elle utilise l'opération mod(), coûteuse en termes de calcul. Par conséquent, cette approche peut être moins efficace que la précédente si l'instance Random fournie a une faible surcharge de performances.

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