洗牌問題 代碼我想這樣寫 感覺邏輯沒問題啊 但運行不出效果 請指教?
System.out.println("開始洗牌");
do{
int ran=(int)(Math.random()*52);
Poker p=poke.get(ran);
if(poke1.contains(p)){
continue;
}else{
poke1.add(p);
}
}while(poke1.size()<=52);
System.out.println("洗牌后順序:");
for(Poker p:poke1){
System.out.print(p.color+p.number+" ");
}
}
2017-09-08
邏輯是沒有問題,但是算法有問題。因為每次都是從來原來的撲克牌里隨機取出一張牌添加到洗好的撲克牌里,當你往洗好的牌里追加牌的時候,剛開始可能抽出的牌不會重復(重復概率相對較低),但是越往后,重復添加牌的可能就越大,這樣容易報:java.lang.OutOfMemoryError: Java heap space的錯。建議在抽出牌的同時刪除原始牌堆的牌,然后縮小random的范圍,這樣添加的牌就不會重復。如下:
System.out.println("開始洗牌");
do{
int ran=(int)(Math.random()*poke.size());
Poker p=poke.get(ran);
poke1.add(p);
poke.remove(p);
}
}while(poke1.size()<=52);
System.out.println("洗牌后順序:");
for(Poker p:poke1){
System.out.print(p.color+p.number+" ");
}
}