我被要求編寫一套用於洗牌的程序(主要是一種方法)。我寫了下面的程序:調換一副牌,交換兩個值後的冗餘
public class Deck {
////////////////////////////////////////
// Data Members
////////////////////////////////////////
private Card[] cards; // array holding all 52 cards
private int cardsInDeck; // the current number of cards in the deck
public static final int DECK_SIZE = 52;
/**
* Shuffles the deck (i.e. randomly reorders the cards in the deck).
*/
public void shuffle() {
int newI;
Card temp;
Random randIndex = new Random();
for (int i = 0; i < cardsInDeck; i++) {
// pick a random index between 0 and cardsInDeck - 1
newI = randIndex.nextInt(cardsInDeck);
// swap cards[i] and cards[newI]
temp = cards[i];
cards[i] = cards[newI];
cards[newI] = temp;
}
}
}
但在這是如下上述洗牌方法的邏輯錯誤:假設我更換卡號4卡號42,那麼我換 兩次。我想知道有沒有辦法不這樣做?
我籤一個崗位在這裏:Shuffling a deck of cards
但它並沒有道理給我。
據我所知,這幾乎是你交換數組中兩個元素的方式(至少對於Java而言) – MadProgrammer 2013-05-01 06:15:39
@MadProgrammer:進行交換的三條線都很好,但是洗牌的一般方法不是。幸運的是,它很容易修復。 – 2013-05-01 06:22:56
@JonSkeet我不得不離開我的頭靠在牆上幾分鐘,但我明白你的意思,OP在每次迭代中洗牌「整個」列表,他們真的應該洗牌的範圍越來越小。清晰如泥;) – MadProgrammer 2013-05-01 06:30:53