如果我有以下方法:
public void randomDecider(){
methodA();
methodB();
methodC();
methodD();
methodE();
}
我唯一想要的是,这些方法中至少有一个会被执行。应该有多种多样。例如:
执行:
的methodB(); methodC(); methodD();
或 methodC();
或 了methodA(); METHODE()
或所有方法
等
我只在论坛中发现了一些随意执行的事情。 但我需要这种变化。
我希望你能帮助我。
最好的问候
答案 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();
}
}