java - 我应该选择 i > 1 还是 i >= 1 进行随机洗牌

标签 java arraylist random collections

我正在尝试以随机方式对整数数组列表进行洗牌。我想出了下面的代码。但是,我怀疑这是正确的方法。我在某处读到 for for(int i = list.size(); i >= 1; i--) in:

public static void shuffling(List<?> list, Random rnd){
    for(int i = list.size(); i >= 1; i--){
        swap(list, i - 1, rnd.nextInt(i));
    }
}

应该写成:

for(int i = list.size(); i > 1; i--)

但是如果我选择将其写为 i > 1 而不是 i >= 1,我是不是忽略了 ArrayList 中的第一项?有人对解决这个问题的正确方法有什么建议吗?

我的代码:

public class TheCollectionInterface {

    public static <E> void swap(List<E> a, int i, int j){
        E temp = a.get(i);
        a.set(i, a.get(j));
        a.set(j, temp);
    }

    public static void shuffling(List<?> list, Random rnd){
        for(int i = list.size(); i >= 1; i--){
            swap(list, i - 1, rnd.nextInt(i));
        }
    }

    public static void main(String[] args) {

        List<Integer> li1 = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9));

        Random r1 = new Random();

        TheCollectionInterface.shuffling(li1, r1);

        System.out.println(li1);
    }
}

最佳答案

在此循环中,当 i = 1 时,唯一要选择的元素是第 0 个元素,并且将第 0 个元素与第 0 个元素交换是微不足道的,不会产生任何效果。因此,不需要使用i = 1进入循环,可以编写i > 1作为条件。

关于java - 我应该选择 i > 1 还是 i >= 1 进行随机洗牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35930293/

相关文章:

c++ - 为什么 mt19937 的 STD 实现有双倍的 sizeof 作为 boost 版本?

java - 如何将两个数组放入迭代器中逐步进行?

random - 如何为 pcg 随机数生成器播种?

java - 在 Java 中,您可以在迭代 List 时修改它吗?

java - 我正在尝试编写一个递归java程序来创建谢尔宾斯基三角形

ArrayList 和 Array 的 Java 通用问题

java - 确定嵌套 Foreach 循环中的当前对象是否相同

python - 对矩阵 python 进行二次采样

java9 的窗口比 java8 的大

java - Android操作栏标题在填充自定义ListView后消失