2016-10-29 105 views
-1

在mehtod執行至少一個方法,如果我有以下方法:我怎樣才能通過隨機

public void randomDecider(){ 
    methodA(); 
    methodB(); 
    methodC(); 
    methodD(); 
    methodE(); 
} 

我唯一希望的是,這些方法中的至少一個會被執行。應該有多種。例如:

Excution的:

的methodB(); methodC(); methodD(); ();();();();();() methodA();

或 methodA(); METHODE()

或所有方法

我只發現在論壇上一些關於隨機只執行一件事。 但我需要這個品種。

我希望你能幫助我。

最好的問候

回答

1

您可以使用Random。這樣,如果需要,您可以輕鬆設置給定方法的概率。

Random r = new Random(); 
Double d = r.nextDouble(); 
if(d < 0.75){ // probability 0.75 
    methodA(); 
} 
d = r.nextDouble(); 
if(d < 0.5){ // probability 0.5 
    methodB(); 
} 

編輯:

如果要被執行的至少一種方法,可以使用的標誌,例如:例如p = 0.5

Random r = new Random(); 
boolean notexecuted = true; 
while(notexecuted){ 
    Double d = r.nextDouble(); 
    if(d < 0.75){ // probability 0.75 
     methodA(); 
     notexecuted = false; 
    } 
    d = r.nextDouble(); 
    if(d < 0.5){ // probability 0.5 
     methodB(); 
     notexecuted = false; 
    } 
} 

對於相等的概率使用固定值(或無論你想要它),並檢查d < p條件。

+0

對於每個可執行方法的組合,概率應該是相同的。我希望這可能,不僅一種方法會被執行。 – kasy

+0

@kasy我已經更新了答案,可能更適合您的需求。 – qwerty1423

+0

是的,謝謝兄弟! – kasy

1

您可以使用隨機生成的位集來確定應執行哪些方法。一個簡單的int可以在這裏用作bitset。例如

public void randomDecider() { 
    int set = rand.nextInt(31) + 1; //we need a 5 bit number with at least one bit in it set to 1 
    if((set & 1) == 1) methodA(); 
    if(((set >> 1) & 1) == 1) methodB(); 
    if(((set >> 2) & 1) == 1) methodC(); 
    if(((set >> 3) & 1) == 1) methodD(); 
    if(((set >> 4) & 1) == 1) methodE(); 
} 

這是一個更通用的做法是使用方法引用。

Runnable[] methods = { 
    this::methodA, this::methodB, this::methodC, 
    this::methodD, this::methodE 
}; 

public void randomDecider() { 
    int set = rand.nextInt((1 << methods.length) - 1) + 1; 
    for(int i = 0; i < methods.length; i++) { 
    if(((set >>> i) & 1) == 1) methods[i].run(); 
    } 
} 
+0

感謝您的解決方案。它的天才。我在我的項目中使用了第一個:) – kasy

+0

這個應該是被接受的答案,因爲它是你使用的答案,而且最簡潔。問候。 –