洗牌問題 代碼我想這樣寫 感覺邏輯沒問題啊 但運(yùn)行不出效果 請(qǐng)指教?
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
邏輯是沒有問題,但是算法有問題。因?yàn)槊看味际菑膩碓瓉淼膿淇伺评镫S機(jī)取出一張牌添加到洗好的撲克牌里,當(dāng)你往洗好的牌里追加牌的時(shí)候,剛開始可能抽出的牌不會(huì)重復(fù)(重復(fù)概率相對(duì)較低),但是越往后,重復(fù)添加牌的可能就越大,這樣容易報(bào):java.lang.OutOfMemoryError: Java heap space的錯(cuò)。建議在抽出牌的同時(shí)刪除原始牌堆的牌,然后縮小random的范圍,這樣添加的牌就不會(huì)重復(fù)。如下:
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+" ");
}
}