将数组顺序打乱
时间: 2025-05-25 22:21:21 浏览: 30
### 实现数组元素顺序随机打乱
#### Fisher-Yates洗牌算法简介
Fisher-Yates洗牌算法是一种高效的算法,能够确保每个排列出现的概率相等。此算法通过迭代地从未处理的部分选择一个随机元素并与当前元素交换来工作[^1]。
#### C#实现示例
下面展示的是利用C#语言实现的基于Fisher-Yates算法的数组打乱功能:
```csharp
using System;
public class Program {
public static void Main() {
int[] array = { 1, 2, 3, 4, 5 };
Shuffle(array);
foreach(var item in array){
Console.WriteLine(item);
}
}
private static Random rng = new Random();
public static void Shuffle<T>(T[] array) {
for (int n = array.Length; n > 1;) {
int k = rng.Next(n--); // 随机选一个索引
T temp = array[n];
array[n] = array[k];
array[k] = temp;
}
}
}
```
这段代码首先初始化了一个整型数组`array`,接着调用了静态方法`Shuffle()`来进行打乱操作。注意这里使用了泛型使得函数可以适用于任何类型的数组。
#### Java实现方式
对于Java而言,同样可以通过引入`Random`类实例化对象来获取伪随机数源,并以此为基础完成类似的逻辑:
```java
import java.util.Random;
class Solution {
private final Random randGen = new Random();
/** Resets the array to its original configuration and return it. */
public int[] reset(int[] nums) {
return Arrays.copyOf(nums, nums.length);
}
/** Returns a random shuffling of the array. */
public int[] shuffle(int[] nums) {
for (int i = nums.length - 1; i >= 0; --i) {
swapAt(nums, i, this.randGen.nextInt(i + 1));
}
return nums;
}
private void swapAt(int[] A, int i, int j) {
if (i != j) {
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
}
```
在这个例子中,除了实现了基本的打乱外还提供了重置的功能以便于多次测试验证效果[^5]。
#### Python简洁版
Python由于其内置库的支持可以让这个过程更加简单明了:
```python
from random import randint
def fisher_yates_shuffle(lst):
for i in range(len(lst)-1, 0, -1):
j = randint(0, i)
lst[i], lst[j] = lst[j], lst[i]
example_list = ['apple', 'banana', 'cherry']
fisher_yates_shuffle(example_list)
print(example_list)
```
这里的`randint(a,b)`会生成[a,b]区间内的一个随机整数作为新的位置索引来与当前正在访问的位置做交换[^2]。
阅读全文
相关推荐


















