2013-06-28 28 views
15

我需要生成一些隨機布爾值。不過,我需要能夠指定返回概率true。作爲結果做:具有權重或偏差的隨機布爾值

private Random random = new Random(); 
random.nextBoolean(); 

將無法​​正常工作。

一個可能的解決辦法是:

private Random random = new Random() 

public boolean getRandomBoolean(float p){ 
return random.nextFloat() < p; 
} 

我想知道是否有這樣做的更好或更自然的方式。

編輯: 我想我是問有沒有提供nextBoolean(浮點概率)方法的庫類。

+3

什麼樣的「更好」你找誰?這對我來說似乎是合理的... –

+1

這些是兩個(本質上)單獨的問題,所以應該在兩個單獨的帖子中提出... –

+0

@JonSkeet我想我期望沿着Random.nextBoolean(長概率) – maxf130

回答

9

我想知道是否有更好或更自然的方式來做到這一點。

您使用的方法已經很好。 AFAIK,沒有一個標準的Java方法可以縮短代碼長度。


*用於非加密目的。

+2

這是不是一個評論?? –

+0

@Baadshah:嗯,是的。我現在已經改寫了! –

+0

是的..完美! +1。 –

-1

你的方法可能會更好,代碼高爾夫球明智的,但另一種方式來做到這一點是這樣的:

public boolean getRandomBoolean() { 
    Random random = new Random(); 
    //For 1 in 5 
    int chanceOfTrue = 5; 

    if (random.nextInt(chanceOfTrue) == 0) { 
     return true; 
    } else { 
     return false; 
    } 
} 

或者在5 2,試試這個:

public boolean getRandomBoolean() { 
    Random random = new Random(); 
    //For 2 in 5 
    int chanceOfTrue = 5; 
    int randInt = random.nextInt(chanceOfTrue); 

    if (randInt == 0 || randInt == 1) { 
     return true; 
    } else { 
     return false; 
    } 
} 
-1

隨機對象需要初始化。

public static boolean flipRandom(double probability) { 
    Validate.isBetween(probability, 0, 1, true); 
    if(probability == 0) 
     return false; 
    if(probability == 1) 
     return true; 
    if(probability == 0.5) 
     return random.nextBoolean(); 
    return random.nextDouble() < probability ? true : false; 
} 
+0

驗證是合理的,其餘的使得代碼不必要的可讀性降低。保持簡單 – Oneiros

0
public boolean getBiasedRandom(int bias) { 
     int c; 
     Random t = new Random(); 
    // random integers in [0, 100] 
     c=t.nextInt(100); 
     if (c>bias){return false; 
     } 
     else{return true;} 
     } 

這是一個基於百分比...

0

下面是我使用的是什麼。與FracturedRetina的答案非常相似。

Random random = new Random(); 

// 20% chance 
boolean true20 = (random.nextInt(5) == 0) ? true : false; 

// 25% chance 
boolean true25 = (random.nextInt(4) == 0) ? true : false; 

// 40% chance 
boolean true40 = (random.nextInt(5) < 2) ? true : false; 
+1

三元運算符是完全多餘的。爲什麼不只是'boolean true20 =(random.nextInt(5)== 0)'? – Oneiros

+0

當你學習一件新事物時,你知道如何在每種情況下都有用嗎?我完全同意這是多餘的。 – bobanahalf

0

擴展在user2495765的答案, 你可以做一個函數,它接受一個輸入比率(如兩個值可能:範圍見代碼)

public class MyRandomFuncs { 
    public Random rand = new Random(); 

    boolean getBooleanAsRatio(int chance, int range) { 
     int c = rand.nextInt(range + 1); 
     return c > chance; 
    } 

}

根據您打算什麼要做的,你可能不希望在你的方法中使用Random,而是用作類變量(如上面的代碼),並從你的函數中調用nextInt()。

0

MockNeat庫實現此功能。

例,用於生成具有可真99.99%的布爾值:

MockNeat m = MockNeat.threadLocal(); 
boolean almostAlwaysTrue = m.bools().probability(99.99).val();