0
public static GetRandomFunc() {
    switch((int)(Math.random()*NUM_FUNCTIONS)  {
        case 0:
            functionA();
            break;
        case 1:
            functionB();
            break;
        case 2:
            functionC();
            break;
          //  ...
    }
}

我想在 main 中随机调用 GetRandomFunc() ,直到每个函数都被调用一次然后结束。我如何确保一个函数只被调用一次,而不是再次被调用。

4

4 回答 4

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 的是一个例外——即使有数千个函数要调用,它仍然会很快。)

于 2012-08-04T23:03:40.673 回答
0

用于记录是否已调用函数的位字段以及if如果该位已设置则不调用该函数的语句 - 继续循环直到设置所有位。

(或者正如 Alex D 所说,创建一组数字以预先使用)

无论哪种方式,诀窍都是确保您只生成一次每个数字 - 如果您搞砸了这一点,您可能会陷入无限循环(例如等待获取数字 1、2 和 3,但您的随机函数正在生成 0 , 1 和 2)

于 2012-08-04T23:06:29.360 回答
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 中的所有元素都为真。

于 2012-08-04T23:06:52.183 回答
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];
}
于 2012-08-04T23:09:04.703 回答