`
wang吖
  • 浏览: 240686 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何打乱List 或 Array元素的顺序

 
阅读更多

如何打乱List 或 Array元素的顺序

打乱List或者Array数据元素的顺序,其实就是让集合中的元素变得随机,举个例子,有如下一个Array数据: 
其中存储了 1, 2, 3, 4, 5 一共五个元素,经过程序随机排序后得到另外一个随机乱序的数组。

这里写图片描述

其Java实现代码如下

public class ArrayRandomUtils {

    public static void main(String[] args) {

        int[] arr = new int[]{1, 2, 3, 4, 5};

        arr = randomArr(arr);

        System.out.println(Arrays.toString(arr));
    }

    public static int[] randomArr(int[] arr) {

        int[] arrTemp = new int[5];
        int end = arr.length;
        Random rad = new Random();

        for (int i = 0; i < arr.length; i++) {
            int index = rad.nextInt(end);
            arrTemp[i] = arr[index];
            arr[index] = arr[end - 1];
            end--;
        }

        return arrTemp;
    }
}

实现思路如下: 
1、随机生成一个原数组长度内的随机整数 index; 
2、将随机位置 index 上的元素拷贝到新数组的第 i 个位置; 
3、然后,将原数组中第 end(end的初始值为原数组的长度) 个元素拷贝至原数组的第 index 位置; 
4、最后,将 end– 相当于原数组的一个元素已经被随机到了新数组中。

处理流程: 
这里写图片描述

Collections 洗牌算法源码 
了解了以上数组元素随机打乱的算法之后,再来看一下Collections 的 shuffle 方法的源码就很好理解了。

public static void shuffle(List<?> list) {
    Random rnd = r;
    if (rnd == null)
        r = rnd = new Random();
    shuffle(list, rnd);
}

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]);
        }
    }
}
 
分享到:
评论

相关推荐

    4种思路随机乱序输出数组元素

    Java的Collections类提供了一个名为shuffle()的方法,可以用来随机打乱列表中的元素顺序。对于数组,我们可以先将其转换为ArrayList,然后打乱,再遍历输出。代码如下: ```java Integer[] array = {...}; // ...

    Java.util.Collection类的学习.pdf

    * 排序(Sort):使用sort方法可以根据元素的自然顺序对指定列表按升序进行排序。 * 混排(Shuffling):使用shuffle方法可以打乱在一个List中的任何排列的踪迹。 * 反转(Reverse):使用reverse方法可以根据元素的...

    js刷新随机排列展示代码.zip

    "js刷新随机排列展示代码"提供了一种解决方案,适用于个人信息展示或商品展示等场景,让元素每次加载时都以不同的顺序呈现,增加视觉新鲜感。 首先,我们需要理解随机排列的核心原理。在JavaScript中,我们可以使用...

    php数组函数分类

    - **shuffle()**: 打乱数组中的元素顺序。 - **array_reverse()**: 反转数组中的元素顺序。 - **array_multisort()**: 同时对多个数组进行排序。 #### 获取部分(Part) 这些函数用于从数组中获取部分数据或处理...

    Collections 随机排序方法Shuffle源码说明

    这意味着它不会创建新的列表,而是直接修改输入的列表,将元素的顺序随机打乱。源码如下: ```java public static void shuffle(List&lt;?&gt; list, Random r) { int size = list.size(); if (size || list instanceof...

    PHP数组详解[整理].pdf

    6. 其他操作:`array_rand()`选取随机元素,`shuffle()`打乱数组顺序,`array_sum()`计算数组元素总和,`range()`创建包含等差序列的数组。 在操作PHP数组时需注意: 1. 使用"+"运算符合并数组,不会覆盖重复键值。...

    PHP数组详解.pdf

    - `array_rand()`从数组中随机选择一个或多个元素。 - `shuffle()`随机打乱数组。 - `array_sum()`计算数组所有值的和。 - `range()`创建一个包含指定范围的数组。 六、操作数组的注意事项 1. 数组运算符号:...

    php函数iris整理

    - **`array_reverse()`**: 反转数组中的元素顺序。 - **`array_search()`**: 在数组中搜索给定的值,返回相应的键名。 - **`array_shift()`**: 移除数组的第一个元素,并返回被移除的元素。 - **`array_slice()`**: ...

    php数组——记忆卡

    - **shuffle()**:打乱数组顺序。 - **print_r()**:打印关于变量的易于理解的信息。 - **var_dump()**:打印变量的相关信息。 ##### 4. 实例代码 下面是一些示例代码,用于演示如何使用PHP数组函数: - **判断...

    PHP函数大全(TXT版)

    - **定义与用途**:打乱数组中元素的顺序。 - **函数原型**: ```php void shuffle(array &$array); ``` - **参数说明**: - `$array`:要打乱顺序的数组。 - **返回值**:无。 **23. `sizeof`** - **定义...

    484个PHP必备的函数集

    - **功能**:反转数组中的元素顺序。 - **示例**:`$reversed = array_reverse($arr);` 32. **array_search** - **功能**:在数组中搜索给定的值,如果找到,则返回相应的键名。 - **示例**:`$key = array_...

    关于列表有用的一些方法.pptx

    要随机打乱列表中元素的顺序,可以使用`Collections.shuffle()`方法: ```java Collections.shuffle(list); System.out.println(list); ``` 这将使用伪随机数生成器重新排列列表中的元素。 在Java中,`...

    PHP函数大全.pdf

    17. **`shuffle`**: 随机打乱数组元素的顺序。 18. **`sizeof`** 或 **`count`**: 相同功能,返回数组元素的数量。 19. **`sort`**: 对数组按值进行升序排序。 20. **`uasort`, `uksort`, `usort`**: 分别按照...

    全面解析PHP常用函数.doc

    - `shuffle`:随机打乱数组的顺序。 - `sizeof`:获取数组的大小(等同于`count()`)。 - `sort`:按升序对数组进行排序。 - `uasort`:根据用户自定义的函数对数组的值进行排序。 - `uksort`:根据用户自定义...

    数组处理函数库第1/2页

    `current`),`prev`(将内部指针向前移动),`range`(创建一个包含指定范围数字的数组),`reset`(将内部指针重置到数组的第一个元素),`rsort`(按降序排序数组的值),`shuffle`(随机打乱数组的顺序),...

    Python的numpy库中将矩阵转换为列表等函数的方法

    为了打乱数组的元素顺序,可以使用`numpy.random.shuffle()`方法。这是机器学习和数据处理中常用的方法,以确保数据集的随机性。 Numpy还提供了计算二维数组某一行或某一列的最大值和最小值的功能。这些方法如`min...

    Shuffling:可用于洗牌的各种算法

    洗牌的目的是为了打乱一个序列的原有顺序,使其变得无规律,从而达到随机化的效果。在这个主题中,我们将深入探讨几种可用于洗牌的算法,并重点以Java语言为例进行说明。 首先,最经典的洗牌算法是Fisher-Yates(也...

    php 数组的指针操作实现代码

    - `shuffle()`随机打乱数组的顺序。 - `asort()`按照值对数组进行升序排序,同时保持键的关联。 - `arsort()`按照值对数组进行降序排序,同时保持键的关联。 - `ksort()`按照键的顺序对数组进行升序排序。 - `...

    PHP产生不重复随机数的5个方法总结

    这种方法首先创建一个从1到50的整数数组,然后使用`shuffle`函数将其顺序打乱,最后通过`array_slice`截取前 `$num` 个元素,以得到不重复的随机数。 **方法二:结合`srand`和`each`** ```php $numbers = range(1, ...

Global site tag (gtag.js) - Google Analytics