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!