問題是:我需要洗牌一副牌(ArrayList或52個整數(0到51)數組)。我還需要在Android處理器上完成200,000次。請幫助我優化這一點,因爲即使在更高端的設備上(最多10秒),這也花費了令人難以置信的時間。優化洗牌ArrayList
方法我試過:
1)洗牌與Collections.shuffle和借鑑第一卡我得到(發生在Nexus7 8秒):
for(long i = 0; i < ITERATIONS; i++) { // ITERATIONS is 200,000
ArrayList<Integer> fakeDeck = (ArrayList) deck.clone(); // deck is the sorted deck.
Collections.shuffle(fakeDeck);
int card1 = fakeDeck.get(0);
int card2 = fakeDeck.get(1);
int card3 = fakeDeck.get(2);
int card4 = fakeDeck.get(3);
int card5 = fakeDeck.get(4);
// do something with cards.
}
2)隨機挑選從卡一個unshuffled甲板(好一點,需要5秒):
for(long i = 0; i < ITERATIONS; i++) { // ITERATIONS is 200,000
ArrayList<Integer> fakeDeck = (ArrayList) deck.clone(); // deck is the sorted deck.
int card1 = pullCardFromDeck(fakeDeck);
int card2 = pullCardFromDeck(fakeDeck);
int card3 = pullCardFromDeck(fakeDeck);
int card4 = pullCardFromDeck(fakeDeck);
int card5 = pullCardFromDeck(fakeDeck);
// do something with cards.
}
// pullCardFromDeck是:
private int pullCardFromDeck(ArrayList<Integer> deck) {
int randomNumber = new Random().nextInt(deck.size());
int card = deck.get(randomNumber); // get a random card.
deck.remove(randomNumber); // remove the card from the deck.
return card;
}
是否真的有必要每次克隆卡座? – Radiodef
在第一個例子中,並不是必需的,我可以重新洗牌相同的套牌,在我需要的第二個例子中,因爲我刪除了紙牌。但這真的不是問題,因爲與洗牌相比,克隆只需要很少的時間。 – VM4
'隨便'不便宜。將它移到循環之外並傳遞給您的方法。 – Jeffrey