Java 的 Collections.shuffle 是做什么的?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2249520/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java's Collections.shuffle is doing what?
提问by Stephano
I recently found myself needing to be sure my list wasn't in order. Hibernate was nice enough to return it in perfect order. Silly hibernate, not reading my mind.
我最近发现自己需要确保我的清单没有按顺序排列。Hibernate 非常好,可以完美地返回它。傻冬眠,不读我的心。
I looked at my Java API and it tells me its shuffle method does this:
我查看了我的 Java API,它告诉我它的 shuffle 方法是这样做的:
Randomly permutes the specified list using a default source of randomness.
使用默认的随机源随机排列指定的列表。
Being the curious george that I am, I want to know what exactly this means. Is there a math course I can take to learn this? Can I see the code? Java, what are you doing to my ArrayList?!?!?
作为好奇的乔治,我想知道这到底意味着什么。有没有我可以学习的数学课程来学习这个?我可以看看代码吗?Java,你对我的 ArrayList 做什么?!?!?
To be more specific, which math concepts are being used here?
更具体地说,这里使用了哪些数学概念?
采纳答案by Chris Jester-Young
Yes, you can look at the code; it basically does a Fisher-Yates shuffle. Here it is (thanks OpenJDK, and yay for open source :-P):
是的,可以看代码;它基本上是一个Fisher-Yates shuffle。在这里(感谢 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]);
}
}
}
The swap method:
交换方法:
private static void swap(Object[] x, int a, int b) {
Object t = x[a];
x[a] = x[b];
x[b] = t;
}
回答by Bill the Lizard
The CollectionsJavaDoc gives some information on the shuffle method used.
该集合的JavaDoc提供了所使用的洗牌方法的一些信息。
This implementation traverses the list backwards, from the last element up to the second, repeatedly swapping a randomly selected element into the "current position". Elements are randomly selected from the portion of the list that runs from the first element to the current position, inclusive.
此实现向后遍历列表,从最后一个元素到第二个元素,反复将随机选择的元素交换到“当前位置”。元素是从列表中从第一个元素到当前位置(含)的部分中随机选择的。
So it starts at the end and walks the list backwards. At each element it stops and swaps the current element with a preceding element from the list. The "default source of randomness" in this case is probably a Randomobject created with a default seed.
所以它从最后开始并向后遍历列表。在每个元素处,它停止并将当前元素与列表中的前一个元素交换。在这种情况下,“默认随机源”可能是使用默认种子创建的Random对象。