java - stdrandom shuffle 方法的工作原理

标签 java sorting shuffle

 public static void shuffle(Object[] a) {
    int N = a.length;
        for (int i = 0; i < N; i++) {
            int r = StdRandom.uniform(i + 1);      
            exchange( a, i , r) 
        }
    }

上面是用 java 编码的 StdRandom 类的方法。我想知道为什么 stdRandom.uniform( i + 1) 它在 0 和 i 之间,而不是在 0 和 (N - 1) 之间。

最佳答案

洗牌算法的工作原理就像您戴着帽子洗牌一样。将所有卡片松松地扔进帽子里。随机抽出一张牌放在位置 0,然后再抽出一张牌放在位置 1,以此类推,直到帽子空了,所有位置都填满了。

在填充 i 的算法中,数组的其余部分(位置 i+1、i+2、... N-1)是帽子。 交换正在从帽子中随机取出一个元素并将其放置在需要的地方。 位于位置i的项目向上移动,以便它仍然在帽子中。它在帽子中的位置并不重要,因为下一个随机数将以相同的概率选择所有帽子位置。

希望这个直观的解释有意义......

关于java - stdrandom shuffle 方法的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22015735/

相关文章:

java - 洗牌——数组还是堆栈?

R:按列随机排列数据帧

php - 基于种子的改组数组以获得始终相同的结果?

java - 将数据转换为 openNLP 兼容的训练格式

java - java中优先级队列中offer()和add()的区别?

ruby-on-rails - 在 Rails 3 中按虚拟属性排序

c++ - 如何打印数组元素的索引号?

java - Play Framework 控制台不使用自定义配置

java - Junit 5 的 assertEquals 与 double 的精度

ruby - 给定 ruby​​ 中的这些键,我如何对这个散列进行排序?