Maison  >  Article  >  Java  >  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
Linda Hamiltonoriginal
2024-10-25 01:02:30407parcourir

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)

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

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

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