2014-02-18 93 views
2

這裏的問題是描述:麻煩卡洗牌方法工作

「混洗方法通過卡的陣列循環洗牌卡對象的對象數組一個位置的時間和交換(見陣列講座的幻燈片62-63),卡片在隨機位置(由隨機數決定)在0和51之間的位置。

我已經寫了下面的代碼來完成上述操作,但它並沒有洗牌我的卡片對象。

public void shuffle() 
{ 
    //reset nextCard to 0. 
    nextCard = 0; 

    Random randomGen = new Random(); 
    Card tempCard; 

    int randomNum = randomGen.nextInt(DECK_SIZE); 

    int i; 
    for(i=0;i<DECK_SIZE;i++) 
    { 
     tempCard = deck[i]; 
     deck[i] = deck[randomNum]; 
     deck[randomNum] = tempCard; 
    }//end for. 
}//end shuffle(). 

什麼問題,我該如何解決?

P.S.我會根據請求發佈控制檯輸出。

+0

你應該生成'randomNum'內循環,並嘗試生成再次,如果它是一樣'i' – bjhaid

回答

4

您應該產生randomNumfor循環

改寫你的循環的每一次迭代這樣會給您預期的結果,

int randomNum; 
int i; 
for(i=0;i<DECK_SIZE;i++) 
{ 
    randomNum = randomGen.nextInt(DECK_SIZE); 
    tempCard = deck[i]; 
    deck[i] = deck[randomNum]; 
    deck[randomNum] = tempCard; 
}//end for. 
+0

沒辦法..舉行。立即嘗試。 – Chisx

+2

隨機附註 - 可能不均勻分佈。看一下[Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher-Yates_shuffle#The_modern_algorithm) - 這是一個衆所周知的算法,看起來與此類似(當然有一些顯着差異) 。 – Dukeling

+0

非常感謝。 @Dukeling – Chisx

2

@Karthik的方法不正確,因爲它使用randomGen.nextInt (DECK_SIZE),每次返回一個數字[0..DECK_SIZE-1]。你真正想要的是用DECK [i + 1] .. DECK [N-1]中的一個值替換DECK [i],這是其餘值中尚未使用的值之一。這叫做Knuth洗牌。

public static void shuffle(int[] a) 
{ 
    int N = a.length; 
    for (int i = 0; i < N; i++) 
    { // Exchange a[i] with random element in a[i..N-1] 
     int r = i + StdRandom.uniform(N-i); 
     int temp = a[i]; 
     a[i] = a[r]; 
     a[r] = temp; 
    } 
} 
+0

不錯。非常好。我用他的,所以他應該得到答案,但這是正確的,我聽說過Knuth洗牌,但不知道如何實現它,謝謝你給我看這個。 +1 – Chisx