代码之家  ›  专栏  ›  技术社区  ›  Stephano

Java的Collections.shuffle正在做什么?

  •  39
  • Stephano  · 技术社区  · 16 年前

    我最近发现自己需要确保我的名单没有按顺序排列。Hibernate非常好,可以按完美的顺序返回它。愚蠢的冬眠,不读我的心思。

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

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

    作为一个好奇的乔治,我想知道这到底意味着什么。有数学课我可以学吗?我能看看密码吗?Java,你对我的ARARYLIST做了什么?!?!?

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

    2 回复  |  直到 16 年前
        1
  •  49
  •   Blundell    15 年前

    是的,您可以查看代码;它基本上可以 Fisher-Yates shuffle .这里是(感谢OpenJDK和Yay提供开源服务):-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;
    }
    
        2
  •  6
  •   Bill the Lizard    16 年前

    这个 Collections JavaDoc提供了一些关于所使用的随机播放方法的信息。

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

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

    推荐文章