📅  最后修改于: 2023-12-03 14:58:03.348000             🧑  作者: Mango
在编写程序时,有时需要对数组中的元素进行随机排序。一种有效的方法是通过交换相邻元素来打乱每个 Array 元素的位置。本文将向你介绍如何实现这个功能。
Fisher-Yates 算法是一种简单而广泛使用的随机排列算法。它的基本思路是从数组末尾开始,逐个随机选取一个元素与数组中随机位置的一个元素进行交换。这种交换方式可以确保每个元素被重复随机一次,从而实现了随机打乱数组的效果。
以下是该算法的代码实现:
import random
def shuffle(arr):
n = len(arr)
for i in range(n-1, 0, -1):
j = random.randint(0, i)
arr[i], arr[j] = arr[j], arr[i]
Knuth 洗牌算法是 Fisher-Yates 算法的一个改进,该算法的时间复杂度为 O(n)。其基本思路是每次从数组中选取一个元素,并将该元素与数组中的任意一个元素进行交换。这种交换方式可以确保每个元素被重复随机一次,并且避免了 Fisher-Yates 算法在索引值随机选择上的一些问题。
以下是该算法的代码实现:
import random
def shuffle(arr):
n = len(arr)
for i in range(n):
j = random.randint(i, n-1)
arr[i], arr[j] = arr[j], arr[i]
调用以上两个函数即可对数组进行随机打乱操作。例如,如果你有一个包含 10 个元素的列表 arr
,你可以通过如下方式进行打乱:
shuffle(arr)
打乱后的数组元素顺序将是随机的,而不是原来的顺序。
通过以上介绍的两种交换相邻元素的方法,我们可以轻松地将数组中的元素进行随机打乱,并确保每个元素被重复随机一次。如果你想让你的程序更加高效,可以考虑使用 Knuth 洗牌算法。