【发布时间】:2023-04-07 10:09:01
【问题描述】:
问题是这样的:我需要洗牌(ArrayList 或 52 个整数的数组(0 到 51))。我还需要在 Android 处理器上执行 200,000 次。请帮我优化它,因为即使在更高端的设备上(最多 10 秒),这也会花费令人难以置信的时间。
我尝试过的方法:
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) 从未洗牌的牌组中随机挑选牌(更好一点,需要 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;
}
【问题讨论】:
-
真的有必要每次都克隆套牌吗?
-
在第一个例子中它不是必需的,我可以重新洗牌相同的牌组,在第二个例子中我需要,因为我移除了卡片。但这确实不是问题,因为与改组相比,克隆需要的时间很少。
-
Randoms 制作起来并不便宜。将其移出循环并将其传递给您的方法。 -
I also need to do this 200,000 times and on an Android processor.为什么?另外,为什么要洗牌?你不能在需要的时候随机抽卡吗? -
“因为与改组相比,克隆花费的时间很少”您通过基准测试确定了这一点...对吗?
标签: java android optimization arraylist