2016-10-29 204 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

这个应该是被接受的答案,因为它是你使用的答案,而且最简洁。问候。 –