调用随机函数

问题描述:

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

+0

嗨,请你告诉我如何在集合中的功能。 – user872009 2012-08-05 09:45:43

+0

刚刚添加了一个代码示例给你的想法。 – 2012-08-05 10:22:12

用于记录函数是否已被调用的位域和用于不调用函数的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所有元素都是真实的。

+0

嗨,它只称它一次。我试着从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]; 
}