public static GetRandomFunc() {
switch((int)(Math.random()*NUM_FUNCTIONS) {
case 0:
functionA();
break;
case 1:
functionB();
break;
case 2:
functionC();
break;
// ...
}
}
我想在main中随机调用GetRandomFunc(),直到每个函数被调用一次然后结束。如何确保只调用一次函数,而不再调用它。
答案 0 :(得分:4)
将值存储在集合中会更容易,并随机绘制它们直到集合为空。或者更好的是,将收集整理,然后顺序遍历它。
集合中的值可以是整数,也可以是不同类的对象(具有公共超类或接口),它们提供call()
方法的不同实现。
例如:
import java.util.*;
import java.util.concurrent.*;
List<Runnable> functions = new ArrayList<Runnable>();
functions.add(new Runnable() {
public void run() { /* do something */ }
});
functions.add(new Runnable() {
public void run() { /* do something else */ }
});
Collections.shuffle(functions);
for(Runnable function : functions)
function.run();
此线程上的其他帖子显示了其他可能的解决方案,但所有这些解决方案都比这个更复杂且容易出错,并且如果函数数量很大,它们中的大多数都会非常慢。 (来自@AndersLinden的那个是一个例外 - 即使有数以千计的函数要调用它仍然会很快。)
答案 1 :(得分:0)
用于记录函数是否已被调用的位字段以及如果已经设置了位而不调用该函数的if
语句 - 保持循环直到所有位都已设置。
(或正如Alex D所说,创建一组数字以便在前面使用)
无论哪种方式,诀窍是确保你只生成一次和一次 - 如果你搞砸了这一位你可以最终进入一个无限循环(例如等待获得数字1,2和3,但你的随机函数正在生成0,1和2)
答案 2 :(得分:0)
您可以创建一个数组来跟踪已经使用过的函数。
例如:
boolean[] usedFunctions = new boolean[NUM_FUNCTIONS];
public static GetRandomFunc() {
switch((int) (Math.random() * NUM_FUNCTIONS) {
case 0:
if(!usedFunctions[0]) {
functionA();
usedFunctions[0] = true;
}
break;
case 1:
if(!usedFunctions[1]) {
functionB();
usedFunctions[1] = true;
}
break;
// etc.
}
}
然后您需要做的就是重复调用GetRandomFunc(),直到usedFunctions中的所有元素都为真。
答案 3 :(得分:0)
保留一个整数数组,告诉哪些索引仍未使用。 使用整数时,将其填入列表中最后一个索引的孔中,并将其视为一个列表,其中一个项目更短。
int indexes[] = new int[3];
for (int i = 0; i < 3; i++)
indexes[i] = i;
for (int i = 0; i < 3; i++)
{
int index = (int)(Math.random()*(3 - i));
switch (indexes[index])
{
case 0:
functionA();
break;
case 1:
functionB();
break;
case 2:
functionC();
break;
}
indexes[index] = indexes[2 - i];
}