2011-11-18 12 views
28

Ero curioso di sapere come implementare la probabilità in Java? Ad esempio, se le probabilità che una variabile mostri è 1/25, come potrei implementarla? O qualche altra probabilità? Per favore, indicami la direzione generale.Probabilità in Java

+3

check out java Classe casuale. Questo ti permette di generare un numero casuale, e puoi andare da lì ... –

risposta

53

Si dovrebbe usare Random per generare un numero casuale, quindi testarlo contro un valore letterale per abbinare la probabilità che si sta tentando di raggiungere.

Così dato:

boolean val = new Random().nextInt(25)==0; 

val avrà un 1/25 probabilità di essere vera (dal nextInt() ha un ancora probabilità di restituire qualsiasi numero a partire da 0 e fino a, ma non incluso, 25.)

Ovviamente è necessario anche import java.util.Random;.

Come sottolineato in basso, se stai ricevendo più di un numero a caso sarebbe più efficiente di riutilizzare l'oggetto a caso, piuttosto che ricreare tutto il tempo:

Random rand = new Random(); 
boolean val = rand.nextInt(25)==0; 

..

boolean val2 = rand.nextInt(25)==0; 
+1

ottima logica! Grazie! –

+1

+1: posizionare il 'nuovo Random()' in un campo o variabile e riutilizzarlo aiuterebbe l'efficienza. –

+0

@PeterLawrey hai ragione, naturalmente, ho modificato la risposta in modo appropriato. L'ho messo in questo modo come un esempio di 1 linea! – berry120

25

Generalmente si utilizza un generatore di numeri casuali. La maggior parte di questi restituisce un numero nell'intervallo [0,1] in modo da verificare se tale numero è < = 0,04 oppure no.

if(new Random().nextDouble() <= 0.04) { //you might want to cache the Random instance 
    //we hit the 1/25 (4%) case. 
} 

O

if(Math.random() <= 0.04) { 
    //we hit the 1/25 (4%) case. 
} 

Nota che ci sono più generatori di numeri casuali che hanno diverse proprietà, ma per semplici applicazioni della classe Random dovrebbero essere sufficienti.

+0

Nel caso generale, questa soluzione che utilizza rand.nextDouble() è migliore della risposta accettata, poiché può essere applicata a qualsiasi probabilità arbitraria (anziché solo a 1/x per un intero dato x). Ad esempio, se la probabilità di destinazione è 33,5%, non esiste una soluzione semplice e pulita utilizzando rand.nextInt(). – shiri

+1

@shiri che dipende da potenziali problemi di precisione. Usando numeri interi è possibile creare un numero intero compreso tra 0 e 1000 e verificare che il valore sia inferiore a 335. È stato concordato il – Thomas

+1

, suppongo che si tratti di una questione di preferenza. Quando penso alle probabilità tendo a pensare in termini di numeri nell'intervallo [0,1], quindi trovo nextDouble() <= X per essere più pulito. – shiri

5

Java ha una classe denominata java.util.Random che può generare numeri casuali. Se si desidera qualcosa accada con probabilità 1/25, semplicemente generare un numero casuale compreso tra 1 e 25 (o 0 e 24 compreso) e verificare se tale numero è pari a 1.

if(new java.util.Random().nextInt(25)==0){ 
    //Do something. 
} 
2

Forse è possibile implementare questa con la generazione di numeri casuali.

Random rn = new Random(); 
    double d = rn.nextDouble();  // random value in range 0.0 - 1.0 
    if(d<=0.04){ 
    doSomeThing(); 
    } 
6

Poiché 1.7 è meglio usare (nell'ambiente concorrente almeno):

ThreadLocalRandom.current().nextInt(25) == 0 

Javadoc

Un generatore di numeri casuali isolato al thread corrente. Come il generatore Random globale usato dalla classe Math, un ThreadLocalRandom viene inizializzato con un seed generato internamente che non può essere altrimenti modificato. Se applicabile, l'uso di oggetti ThreadLocalRandom piuttosto che di oggetti Random condivisi in programmi concorrenti di solito incontrerà molto meno sovraccarico e conflitto. L'uso di ThreadLocalRandom è particolarmente appropriato quando più attività (ad esempio, ogni ForkJoinTask) utilizzano numeri casuali in parallelo in pool di thread. Gli usi di questa classe dovrebbero in genere essere del tipo: ThreadLocalRandom.current(). NextX (...) (dove X è Int, Long, ecc.). Quando tutti gli usi sono di questo tipo, non è mai possibile condividere accidentalmente un ThreadLocalRandom su più thread.

Questa classe fornisce anche ulteriori metodi di generazione casuale limitati comunemente utilizzati.

Problemi correlati