Java 的 Collections.shuffle 是做什么的? [英] Java's Collections.shuffle is doing what?

查看:27
本文介绍了Java 的 Collections.shuffle 是做什么的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近发现自己需要确保我的列表没有按顺序排列.Hibernate 非常好,可以完美地返回它.傻冬眠,没读懂我的心.

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.

我查看了我的 Java API,它告诉我它的 shuffle 方法是这样做的:

I looked at my Java API and it tells me its shuffle method does this:

使用默认的随机源随机排列指定的列表.

作为好奇的乔治,我想知道这到底意味着什么.有没有我可以学习的数学课程来学习这个?我可以看看代码吗?Java,你对我的 ArrayList 做什么?!?!?

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?!?!?

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

To be more specific, which math concepts are being used here?

推荐答案

可以看代码;它基本上是一个Fisher-Yates shuffle.在这里(感谢 OpenJDK,感谢开源 :-P):

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):

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;
}

这篇关于Java 的 Collections.shuffle 是做什么的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆