2011-09-09 134 views
3

我想編寫代碼來洗牌數組而不使用集合。陣列洗牌不工作

我的洗牌代碼

private double amounts[] = { 0, 0.01, 1000000, 25, 250000, 75, 50, 1000, 
      200, 100, 400000, 750, 5000, 750000, 500, 100000, 300, 75000, 800, 
      20, 300000, 10, 50, 750, 25, 5, 1 }; 

public void Shuffle(){ 

     Random rgen = new Random(); 
     for (int i=0; i > amounts.length; i++) { 
      int randomPosition = rgen.nextInt(amounts.length); 
      double temp = amounts[i]; 
      amounts[i] = amounts[randomPosition]; 
      amounts[randomPosition] = temp; 
    } 
    } 

在這裏啓動它

public void casesSetup() { 

     for (int i = 0; i < briefcase.length; i++) { 

      if (i == 0) { 

      } else { 
       briefcase[i] = new Briefcase(); 
       double value = amounts[i]; 
       briefcase[i].setAmount(value); 
       briefcase[i].setFace(i); 
      } 
     } 
    } 

我的問題是,他們沒有被隨機任何人有一個想法,爲什麼代碼?

+0

試着做'我<的amount.length'而不是'> – Juan

回答

1

我的尖端是開始洗牌反向:

Random rgen = new Random(); 
for (int i = amounts.length - 1; i > 0; --i) { 
    int randomPosition = rgen.nextInt(i + 1); 
    double temp = amounts[i]; 
    amounts[i] = amounts[randomPosition]; 
    amounts[randomPosition] = temp; 
} 

假設的Random.nextInt(N)的分佈是關於0..N-1,這將隨機播放陣列每個置換同等均勻儘可能。對此的論證很直接。

5

在你的第一個片段循環似乎是錯誤的

for (int i=0; i > amounts.length; i++) { 

應該不會是

for (int i=0; i < amounts.length; i++) { 
3

存放在列表中的值,並使用 Collections.shuffle http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.List

自己動手這個看起來不需要

+0

是的,顯然。除非他是作爲一種實踐/作業或簡單地學習Java? –

+0

另外,洗牌實際上是一個相當困難的問題,很容易出錯。是的,使用'Collection.shuffle'並完成它。 – Bombe

+1

我已經知道了,我現在不使用API​​S –

0

除了你的循環是錯誤的,你應該改變

rgen.nextInt(amounts.length) 

rgen.nextInt(amounts.length - i) + i 

得到均勻隨機分佈。