Ho bisogno di generare numeri casuali arbitrariamente grandi nell'intervallo 0 (compreso) su n (esclusivo). Il mio primo pensiero era di chiamare nextDouble
e moltiplicare per n, ma una volta che n diventa più grande di 2 , i risultati non sarebbero più distribuiti uniformemente.Come generare un valore BigInteger casuale in Java?
BigInteger
ha il seguente costruttore disponibile:
public BigInteger(int numBits, Random rnd)
Costruisce un BigInteger generato in modo casuale, uniformemente distribuiti nell'intervallo da 0 a (2 numBits - 1) incluse.
Come può essere usato per ottenere un valore casuale nell'intervallo 0 - n, dove n non è una potenza di 2?
e quanto sono lenti gli RNG tipici di Java? I più comuni sono abbastanza lenti da giustificare questo codice extra? – JeremyKun
Java fornisce un RNG crittograficamente sicuro in 'java.security.SecureRandom' che, sul mio PC, sembra emettere un po 'più di 4 MByte di alea al secondo. Ciò dipende dall'implementazione Java (qui Sun/Oracle Java 1.6.0_26), dall'architettura (Intel Core2, 2.4 GHz, modalità a 64 bit) e dal sistema operativo (Linux). –