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