我如何随机执行mehtod中的至少一种方法

时间:2016-10-29 15:45:26

标签: java

如果我有以下方法:

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

我唯一想要的是,这些方法中至少有一个会被执行。应该有多种多样。例如:

执行:

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

或   methodC();

或   了methodA(); METHODE()

或所有方法

我只在论坛中发现了一些随意执行的事情。 但我需要这种变化。

我希望你能帮助我。

最好的问候

2 个答案:

答案 0 :(得分: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();
}

编辑:

如果您想要至少执行一个方法,可以使用标志,例如:

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;
    }
}

对于相等的概率,使用固定值,例如p = 0.5(或任何你想要的)并检查d < p条件。

答案 1 :(得分:1)

您可以使用随机生成的bitset来确定应该执行哪些方法。这里可以使用一个简单的int作为bitset。 e.g。

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();
  }
}