Java Language Numeri casuali falsi in un intervallo specifico


Esempio

Il metodo nextInt(int bound) di Random accetta un limite esclusivo superiore, ovvero un numero che il valore casuale restituito deve essere inferiore a. Tuttavia, solo il metodo nextInt accetta un limite; nextLong , nextDouble ecc. no.

Random random = new Random();
random.nextInt(1000); // 0 - 999

int number = 10 + random.nextInt(100); // number is in the range of 10 to 109

A partire da Java 1.7, puoi anche usare ThreadLocalRandom ( source ). Questa classe fornisce un PRNG sicuro per thread (generatore di numeri pseudo-casuali). Si noti che il metodo nextInt di questa classe accetta sia un limite superiore che uno inferiore.

import java.util.concurrent.ThreadLocalRandom;

// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
ThreadLocalRandom.current().nextInt(min, max + 1);

Si noti che la documentazione ufficiale afferma che nextInt(int bound) può fare cose strane quando bound è vicino a 2 30 +1 (enfasi aggiunta):

L'algoritmo è leggermente complicato. Respinge i valori che risulterebbero in una distribuzione non uniforme (a causa del fatto che 2 ^ 31 non è divisibile per n). La probabilità che un valore venga rifiutato dipende da n. Il caso peggiore è n = 2 ^ 30 + 1, per cui la probabilità di uno scarto è 1/2, e il numero previsto di iterazioni prima che il ciclo termini è 2.

In altre parole, la specificazione di un limite diminuirà (leggermente) le prestazioni del metodo nextInt e questa riduzione delle prestazioni diventerà più pronunciata quando il bound avvicina a metà del valore massimo int.