当前位置: 代码迷 >> J2SE >> 怎么洗牌
  详细解决方案

怎么洗牌

热度:98   发布时间:2016-04-23 20:43:24.0
如何洗牌
记得以前面试的一道题:让你洗牌(0~53分别代表一张牌,用最高的效率洗一副牌)

方法其实很简单,用下面这段代码就可以:

private static int[] shuffle(int num) {
long begin=System.currentTimeMillis();
int[] cards=new int[num];
List<Integer> list=new ArrayList<Integer>();
for(int index=0;index<num;index++){
list.add(index);
}
Random ran=new Random();
for(int index=0;index<num;index++){
cards[index]=list.remove(ran.nextInt(list.size()));
}
long end=System.currentTimeMillis();
System.out.println("使用ArrayList,用时:"+(end-begin));
return cards;
}
-------
记得当时考官问我为什么不用LinkedList?
最近在看数据结构,结果发现LinkedList貌似可以提高上面的代码的效率!!!

========

然而,用linkedList试验的结果让人很失望!其效率比ArrayList低3倍以上!!!!

上面的代码,如果num为1024*80,计算时间为1.2s;如果换成LinkedList,用时4.6s

========

如果num较大,有没有什么比ArrayList效率高的?
------解决方案--------------------
用Collections.shuffle(list)不行吗
------解决方案--------------------
使用Java自带的Collections.shuffle(list) 最好了。效率也高~
  相关解决方案