2011-11-18 100 views
28

我很好奇,要如何在Java中實現概率?例如,如果變量顯示的機會是1/25,那麼我將如何實現?或者其他任何可能性?請向我指出大方向。Java中的概率

+3

檢出java隨機類。這可以讓你產生隨機數,你可以從那裏去... –

回答

53

你會使用Random來產生一個隨機數,然後根據文字測試它來匹配你試圖達到的概率。

所以給出:

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

val將有被真正的1/25的概率(因爲nextInt()有返回任意數量從0開始爲止,但不包括的概率甚至,25)

您當然也必須import java.util.Random;

正如指出的下方,如果你得到一個以上的隨機數它會是更有效的重用隨機對象,而不是重新創建它所有的時間:

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

..

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

偉大的邏輯!謝謝! –

+1

+1:將'new Random()'放在一個字段或變量中並重用它將有助於提高效率。 –

+0

@PeterLawrey你當然是對的,我已經適當地編輯了答案。我只是把它作爲1行的例子! – berry120

25

通常您使用隨機數字生成器。大多數人返回一個在[0,1]區間內的數字,所以你會檢查這個數字是否爲< = 0.04。

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

或者

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

注意,有具有不同屬性的多個隨機數生成器,但對於簡單的應用Random類應該是足夠了。

+0

在一般情況下,()該溶液使用rand.nextDouble比接受的答案更好,因爲它可以適用於任何任意的概率(而不是僅僅爲1/X爲給定的整數x)。 例如,如果你的目標概率爲33.5%,存在使用rand.nextInt()沒有一個簡單,乾淨的解決方案。 – shiri

+1

@shiri取決於潛在的精度問題。使用整數你可以創建0和1000之間的整數,並檢查該值低於335 – Thomas

+1

同意,我想它歸結爲喜好的問題。當我認爲概率的本人傾向於認爲在[0,1]的範圍內的數方面,所以我找到nextDouble()<= X是清潔器。 – shiri

5

Java有一個名爲java.util.Random的類,它可以生成隨機數。如果你想要的東西以概率1/25發生,簡單地生成1到25(或0-24含)之間的隨機數,檢查數量是否等於1

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

也許你可以實現此隨機生成數字。

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

因爲1.7是更好(至少在併發環境)使用方法:分離當前線程

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

Javadoc

一個隨機數發生器。與Math類使用的全局隨機生成器類似,ThreadLocalRandom使用內部生成的種子進行初始化,否則可能不會進行修改。如果適用,在併發程序中使用ThreadLocalRandom而不是共享Random對象通常會遇到更少的開銷和爭用。當多個任務(例如,每個ForkJoinTask)在線程池中並行使用隨機數時,使用ThreadLocalRandom尤其合適。 這個類的用法通常應該是這樣的形式:ThreadLocalRandom.current()。nextX(...)(其中X是Int,Long等)。當所有用法都是這種形式時,不可能在多個線程中意外共享一個ThreadLocalRandom。

該類還提供了其他常用的有界隨機生成方法。