2017-03-07 114 views
0

所以我創建了一個便士遊戲,代碼將隨機選擇5個單元格。我這樣設置:隨機數組重複

int a = gen.nextInt(5); 
    int b = gen.nextInt(5); 
    int c = gen.nextInt(5); 
    int d = gen.nextInt(5); 
    int e = gen.nextInt(5); 
    int f = gen.nextInt(5); 
    int g = gen.nextInt(5); 
    int h = gen.nextInt(5); 
    int i = gen.nextInt(5); 
    int j = gen.nextInt(5); 
    int penny1 = Parray[a][b]; 
    int penny2 = Parray[c][d]; 
    int penny3 = Parray[e][f]; 
    int penny4 = Parray[g][h]; 
    int penny5 = Parray[i][j]; 

問題是,有時隨機單元格會重複。

我該如何做到這樣一個隨機數組單元格不能重複或再次選擇?

+2

如何不重複代碼行?你需要使用循環。我也會把單元格座標放到某種數組中(2列,5行,每行是一對)。在每個循環獲得每對隨機值後,檢查已存在於陣列中的那些循環,如果它已經存在,則重新滾動。 – tnw

+0

好吧,當將5個不同的值放入10個變量中時,您無法避免重複某些操作。只要'(c,d)'不重複'(a,b)'等,'b'和'c'是否可以重複'a'? –

+0

另外,即使是從Parray的另一個單元中取出,'penny2'是否有可能重複'penny1'?如果是這樣,這是允許的嗎?換句話說,2D數組可能包含複製品? –

回答

1

根據這裏您的具體要求是一個選項:

List<Integer> pennies = new ArrayList<>(NUMBER_OF_PENNIES); 
    for (int p = 0; p < NUMBER_OF_PENNIES; p++) { 
     Integer penny; 
     do { 
      int a = gen.nextInt(5); 
      int b = gen.nextInt(5); 
      penny = pArray[a][b]; 
     } while (pennies.contains(penny)); 
     pennies.add(penny); 
    } 

這將確保便士列表中沒有重複的值。如果你不想重複任何單元格索引,它會變得更復雜一些,但是可以使用類似的技術。

我將您的二維數組重命名爲pArray,以遵循Java命名約定。

0

您需要做的就是確保組合(a,b),(c,d)等是唯一的,這樣您的便士也是唯一的。一個非常簡單的方式來獲得獨特的對一個5x5的一分錢陣列(這是我認爲你正在努力實現的)是:

public static boolean checkIfComboExists(ArrayList<int[]> map,int[] combo){ 
    for(int i = 0; i < map.size(); i++){ 
     int[] elem = map.get(i); 
     if(elem[0] == combo[0] && elem[1] == combo[1]){ 
      return true; 
     } 
    } 
    return false; 
} 

public static void main(String[] args){ 

    int[][] Parray = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}}; 
    Random gen = new Random(); 

    ArrayList<int[]> map = new ArrayList<int[]>(); 
    while (map.size() < 5){ 
     int x = gen.nextInt(5); 
     int y = gen.nextInt(5); 
     int[] combo = {x,y}; 
     if(!checkIfComboExists(map,combo)){ 
      map.add(combo); 
     } 
    } 

    int newpenny1 = Parray[map.get(0)[0]][map.get(0)[1]]; 
    int newpenny2 = Parray[map.get(1)[0]][map.get(1)[1]]; 
    int newpenny3 = Parray[map.get(2)[0]][map.get(2)[1]]; 
    int newpenny4 = Parray[map.get(3)[0]][map.get(3)[1]]; 
    int newpenny5 = Parray[map.get(4)[0]][map.get(4)[1]]; 

    System.out.println(newpenny1); 
    System.out.println(newpenny2); 
    System.out.println(newpenny3); 
    System.out.println(newpenny4); 
    System.out.println(newpenny5); 
} 
1
  1. 創建的25個整數的列表(你有一個5×5格吧?),並逐步將其初始化

    List<Integer> indexes = new ArrayList<>(); 
    for (int i = 0; i < 25; i++) 
        indexes.add(i); 
    
  2. 將它洗

    Collections.shuffle(indexes); 
    
  3. (可選步驟,沒有必要)收縮名單,因爲你只需要第一個5個索引

    indexes.subList(5, indexes.size()-1).clear(); //removing from index 5 to 24 
    
  4. 轉換每個索引到行 - 列座標(例如:索引8對應於第二行,第三列的元素)和存儲相應的便士

    List<Integer> pickedPennies = new ArrayList<>(); 
    for (int i = 0; i < 5; i++) { 
        int row = indexes.get(i)/5; 
        int col = indexes.get(i) % 5; 
        pickedPennies.add(Parray[row][col]); 
    } 
    

我沒有測試它,但我想這個想法很簡單。通過這種方法,您可以避免執行一個醜陋的while循環來檢查您是否已經選擇了一分錢。


替代

Store中的硬幣在列表

List<Integer> pickedPennies = new ArrayList<>(); 
for (int i = 0; i < 5; i++) 
    for (int j = 0; j < 5; j++) 
     pickedPennies.add(Parray[i][j]); 

而且將它洗

Collections.shuffle(pickedPennies); 

前5個名單的元素的隨機便士