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

我想隨機調用GetRandomFunc(),直到每個函數被調用一次,然後結束。我如何確保函數只被調用一次,而不是再次調用。調用隨機函數

回答

4

將值存儲在集合中會更容易,並隨機繪製它們直到集合爲空。或者更好的是,洗滌收集,然後順序地走過去。

集合中的值可以是整數,也可以是不同類的對象(具有公共超類或接口),它們提供了不同的方法實現。

例如:

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

0

用於記錄函數是否已被調用的位域和用於不調用函數的if語句如果它的位已經設置 - 保持循環直到所有的位都被設置。

(或亞歷克斯d說,創建一個數字集合使用了前面)

無論哪種方式,關鍵是要確保你生成每個數字一次,只有一次 - 如果你搞砸這一點了,你可以(例如等待數字1,2和3,但是你的隨機函數產生0,1和2)

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所有元素都是真實的。

+0

嗨,它只稱它一次。我試着從main調用它,但它只調用第一個函數,然後停止。 – user872009 2012-08-07 07:10:44

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