调用随机函数
public static GetRandomFunc() {
switch((int)(Math.random()*NUM_FUNCTIONS) {
case 0:
functionA();
break;
case 1:
functionB();
break;
case 2:
functionC();
break;
// ...
}
}
我想随机调用GetRandomFunc(),直到每个函数被调用一次,然后结束。我如何确保函数只被调用一次,而不是再次调用。调用随机函数
将值存储在集合中会更容易,并随机绘制它们直到集合为空。或者更好的是,洗涤收集,然后顺序地走过去。
集合中的值可以是整数,也可以是不同类的对象(具有公共超类或接口),它们提供了不同的方法实现。
例如:
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中的一个例外 - 即使有数千个函数可以调用,它仍然很快)。
用于记录函数是否已被调用的位域和用于不调用函数的if
语句如果它的位已经设置 - 保持循环直到所有的位都被设置。
(或亚历克斯d说,创建一个数字集合使用了前面)
无论哪种方式,关键是要确保你生成每个数字一次,只有一次 - 如果你搞砸这一点了,你可以(例如等待数字1,2和3,但是你的随机函数产生0,1和2)
你可以创建一个数组来跟踪哪些函数已经被使用。
例如:
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所有元素都是真实的。
嗨,它只称它一次。我试着从main调用它,但它只调用第一个函数,然后停止。 – user872009 2012-08-07 07:10:44
您保留一个整数数组,告诉哪些索引仍未被使用。 当你使用一个整数时,你将它填充到列表中最后一个索引的孔中,并将它作为一个列表缩短一个列表。
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];
}
嗨,请你告诉我如何在集合中的功能。 – user872009 2012-08-05 09:45:43
刚刚添加了一个代码示例给你的想法。 – 2012-08-05 10:22:12