问答详情
源自:7-1 简易扑克牌游戏

洗牌问题 代码我想这样写 感觉逻辑没问题啊 但运行不出效果 请指教?


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 00:53

个回答

  • 风舞煊天
    2017-09-08 17:46:54

    逻辑是没有问题,但是算法有问题。因为每次都是从来原来的扑克牌里随机取出一张牌添加到洗好的扑克牌里,当你往洗好的牌里追加牌的时候,刚开始可能抽出的牌不会重复(重复概率相对较低),但是越往后,重复添加牌的可能就越大,这样容易报: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+" ");

    }

    }