shuffle:随机打乱一个数组

本文深入探讨了两种实现数组随机排列的方法:一是通过自己动手实现,采用从最高位开始与随机位置元素交换的方式;二是利用JDK提供的Collections.shuffle方法,借助List的特性完成随机化。文章详细介绍了每种方法的实现细节,包括代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 自己实现

从最高位起,最高位与后面的随机一位进行交换,交换后最高位就是随机后的,固定再不动,逐次for循环

 		 int length = arr.length;
        for ( int i = length; i > 0; i-- ){
            int randInd = rand.nextInt(i);
            swap(arr, randInd, i - 1);
        }

2. jdk(Collections.shuffle)

  public static void shuffle(List<?> list) {
        Random rnd = r;
        if (rnd == null)
            r = rnd = new Random(); // harmless race.
        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 //装回原数组
            // instead of using a raw type here, it's possible to capture     这里不使用原始类型,而是可以捕获
            // the wildcard but it will require a call to a supplementary 通配符,但它需要调用一个补充
            // private method
            ListIterator it = list.listIterator();
            for (int i=0; i<arr.length; i++) {
                it.next();
                it.set(arr[i]);
            }
        }
    }   
### 使用 `random.shuffle` 方法打乱数组 在 Python 中,可以利用标准库中的 `random.shuffle()` 函数来实现对列表的随机打乱。此函数会对原列表进行就地修改,因此无需返回新列表。 以下是具体示例: ```python import random original_list = [1, 2, 3, 4, 5] random.shuffle(original_list) print(original_list) # 输出可能是类似 [3, 1, 4, 2, 5] 的随机排列 ``` 上述代码展示了如何通过导入 `random` 模块并调用其 `shuffle` 方法来打乱一个整数列表[^5]。 如果需要处理多维数据结构或者更复杂的数值计算场景,则可考虑 NumPy 库中的 `np.random.shuffle()` 或者 `np.random.permutation()` 方法。例如: #### 利用 NumPy 打乱一维数组 ```python import numpy as np arr = np.array([10, 20, 30, 40, 50]) np.random.shuffle(arr) print(arr) # 可能输出类似于 [40 10 50 20 30] 的随机排列 ``` 这里需要注意的是,`np.random.shuffle()` 同样是对目标对象执行就地操作,并不创建副本[^4]。 对于更高维度的数据集来说,比如矩阵形式下的二维数组,它仅限于沿着第一个轴方向上重新安排子项的位置关系而不改变内部元素自身的次序特性。 ```python import numpy as np matrix = np.arange(9).reshape((3, 3)) print("Original Matrix:") print(matrix) np.random.shuffle(matrix) print("\nShuffled along the first axis:") print(matrix) ``` 以上脚本先构建了一个简单的三乘三方阵作为初始状态;接着应用了 `np.random.shuffle()` 来调整行之间的相对位置但保持每行列内成员固定不变。 ### 总结 无论是内置模块还是第三方扩展包都提供了便捷的方式让用户能够轻松达成随机化需求。其中前者适用于常规情况下的简单序列混洗任务,后者则更适合科学运算领域内的复杂情形分析工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值