【问题标题】:Call methods in a random unique order?以随机的唯一顺序调用方法?
【发布时间】:2013-03-28 05:01:17
【问题描述】:

所以我希望随机化调用某些方法的方式,以便每个实例只调用一次,并且每个方法都被调用。

所以说一个实例,它们按顺序调用:

方法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;
}

【问题讨论】:

  • 我最初的直觉是一个基于随机数和状态标志的 switch 语句,以指示调用了哪些方法。
  • @jocopa3 - 你编写了很多代码只是为了随机化。不是很好。看看我发布的答案是否可以简化您的任务。这是一个非常基本的解决方案。

标签: java random unique method-call


【解决方案1】:

根据@Aurand 的建议,您可以有一个将调用您的方法的开关和一个将包含您要调用的方法的索引的List&lt;Integer&gt;,然后使用Collections.shuffle 打乱列表元素并调用@ 987654324@ 调用您的方法。代码示例:

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;
        }
    }
}

问题仍然存在:为什么在实际应用中需要这个?

【讨论】:

  • 这是我正在开发的游戏的一部分,用于根据切换目标的时间来随机化某些对象的操作顺序。
  • 好的,现在你有一个例子。
【解决方案2】:

有点像

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)

【讨论】:

    【解决方案3】:

    我的建议是在初始化期间使用ArrayList 并输入所有方法名称。

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

    使用switch 大小写,无论弹出什么方法名称,调用该方法。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        • 2012-11-19
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        相关资源
        最近更新 更多