以随机唯一顺序调用方法?

时间:2013-03-28 05:01:18

标签: java random unique method-call

因此,我希望随机调整某些方法的调用方式,以便每个实例只调用一次,并调用每个方法。

所以说一个例子就是按顺序调用它们:

方法2 方法4 方法3 方法1

但在下一个例子中,它们以不同的顺序被调用:

方法3 方法2 方法1 方法4

我必须将订单随机化的代码如下所示:

public void randomCalls(){
    int[] order = new int[4];

    for(int i=0; i<order.length; i++){
        order[i]=nextNumber(order);
    }
}

public int nextNumber(int[] array){
    Random r = new Random();
    int x = r.nextInt();
    for(int i=0; i<array.length; i++){
        if(arrayHasNumber(array,x)){
            x = nextNumber(array);
        }
    }
    return x;
}

public boolean arrayHasNumber(int[] array, int x){
    for(int i=0;i<array.length;i++){
        if(array[i]==x){
            return true;
        }
    }
    return false;
}

4 个答案:

答案 0 :(得分:2)

基于@Aurand建议,您可以使用一个可以调用方法的开关和一个包含要调用的方法的索引的List<Integer>,然后使用Collections.shuffle来重新排列列表元素并调用switch来调用您的方法。代码示例:

final int METHODS_QUANTITY = 4;
List<Integer> lstIndexes = new ArrayList<Integer>();
for(int i = 1; i <= METHODS_QUANTITY; i++) {
    lstIndexes.add(i);
}
//you can change the condition for the number of times you want to execute it
while(true) {
    Collections.shuffle(lstIndexes);
    for(Integer index : lstIndexes) {
        switch(index) {
            case 1: method1(); break;
            case 2: method2(); break;
            case 3: method3(); break;
            case 4: method4(); break;
        }
    }
}

然而,问题在于:为什么你需要在现实世界的应用程序中使用它?

答案 1 :(得分:1)

这样的东西
LinkedList methods
methods.add(1)
methods.add(2)
....

for(i=0; i<methods.size;i++)
r = random.next(methods.size)
switch(methods.get(r)) {
case 1: method1()
case 2: method2()
...
methods.remove(methods.get(r)

答案 2 :(得分:1)

我的建议是去ArrayList&amp;在初始化期间抛出所有方法名称。

然后使用random(list.size())获取一个随机数,并从ArrayList中弹出该元素。

使用switch案例,无论弹出哪种方法名称,都要调用该方法。

继续这样做,直到列表变空。

答案 3 :(得分:0)

您可能必须在内部变量或数组中保留状态(进行调用的顺序)(如果您想拥有所有这些状态)。然后调整您的调用站点以使用此状态变量。