Java的Collections.shuffle正在做什么?

我最近发现自己需要确定我的名单不合适。 Hibernate很好,可以按照完美的顺序返回它。 愚蠢的冬眠,没有读我的脑海。

我看着我的Java API,它告诉我它的洗牌方法是这样的:

随机地使用默认的随机源对指定的列表进行排列。

作为我的好奇乔治,我想知道这究竟是什么意思。 我可以学习这个math课程吗? 我可以看到代码吗? Java,你在做什么我的ArrayList?!?!?

更具体地说,这里使用了哪些math概念?

是的,你可以看看代码; 它基本上做了费希尔 – 耶茨洗牌 。 在这里(谢谢OpenJDK,开放源代码:-P):

public static void shuffle(List<?> list, Random rnd) { int size = list.size(); if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) { for (int i=size; i>1; i--) swap(list, i-1, rnd.nextInt(i)); } else { Object arr[] = list.toArray(); // Shuffle array for (int i=size; i>1; i--) swap(arr, i-1, rnd.nextInt(i)); // Dump array back into list ListIterator it = list.listIterator(); for (int i=0; i<arr.length; i++) { it.next(); it.set(arr[i]); } } } 

交换方法:

  private static void swap(Object[] x, int a, int b) { Object t = x[a]; x[a] = x[b]; x[b] = t; } 

Collections JavaDoc提供了一些关于使用的shuffle方法的信息。

这个实现向后遍历列表,从最后一个元素到第二个元素,重复地将一个随机select的元素交换到“当前位置”。 元素从列表中从第一个元素到当前位置(包含)的部分随机select。

所以它从最后开始,向后走。 在每个元素停止,并将当前元素与列表中的前一个元素交换。 在这种情况下,“默认的随机源”可能是使用默认种子创build的Random对象。