Bei der Java-Programmierung erfordert das Generieren zufälliger BigInteger-Werte innerhalb eines vorgeschriebenen Bereichs sorgfältige Überlegungen, um eine gleichmäßige Verteilung und Recheneffizienz sicherzustellen . Man könnte zunächst darauf zurückgreifen, das Ergebnis von nextDouble mit der Obergrenze zu multiplizieren, aber dieser Ansatz wird problematisch, wenn es um Werte geht, die über die Grenzen der doppelten Genauigkeit (253) hinausgehen.
Um dieses Problem zu beheben Problem stellt die BigInteger-Klasse einen geeigneten Konstruktor bereit:
public BigInteger(int numBits, Random rnd)
Dieser Konstruktor generiert einen zufälligen BigInteger im Bereich 0 bis (2numBits - 1) und gewährleistet so eine gleichmäßige Verteilung. Die Herausforderung besteht jedoch weiterhin darin, Werte innerhalb des gewünschten Bereichs (0 bis n) zu erhalten, wobei n nicht unbedingt eine Potenz von 2 ist.
Lösung:
Eine effektive Die Lösung besteht darin, eine Schleife zu verwenden:
<code class="java">BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);</code>
Im Durchschnitt wird diese Schleife weniger als zweimal ausgeführt, wodurch eine gleichmäßige Verteilung gewährleistet wird.
Optimierung für teure RNGs:
Wenn der gewählte RNG rechenintensiv ist, kann die Anzahl der Iterationen begrenzt werden:
<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>
Diese Version verringert die Wahrscheinlichkeit, dass die Schleife mehr als einmal durchlaufen wird, erheblich (weniger als 1 von 2100). Allerdings ist die mod()-Operation rechenintensiv, sodass diese Optimierung möglicherweise nur dann von Vorteil ist, wenn die RNG-Instanz besonders langsam ist.
Das obige ist der detaillierte Inhalt vonWie generiert man in Java zufällige BigInteger-Werte innerhalb eines bestimmten Bereichs?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!