Fisher-Yates shuffle 的 C 实现正确吗

作者:编程家 分类: c++ 时间:2025-10-17

Fisher-Yates shuffle是一种用于将一个数组或列表随机打乱顺序的算法。这个算法的原理是通过遍历数组,从最后一个元素开始,逐步将当前元素与一个随机位置的元素进行交换,直到遍历到第一个元素为止。这样,每个元素都有相等的机会被放置在任意的位置上,从而实现了随机打乱的效果。

下面是Fisher-Yates shuffle的C语言实现代码:

c

#include

#include

#include

void fisherYatesShuffle(int arr[], int size) {

srand(time(NULL));

for (int i = size - 1; i > 0; i--) {

int j = rand() % (i + 1);

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

}

int main() {

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int size = sizeof(arr) / sizeof(arr[0]);

printf("Original array: ");

for (int i = 0; i < size; i++) {

printf("%d ", arr[i]);

}

fisherYatesShuffle(arr, size);

printf("\nShuffled array: ");

for (int i = 0; i < size; i++) {

printf("%d ", arr[i]);

}

return 0;

}

案例代码:Fisher-Yates shuffle的C实现

以上是Fisher-Yates shuffle算法的C语言实现代码。在这个案例中,我们定义了一个包含10个整数的数组,并将其打印输出。接着,我们调用了fisherYatesShuffle函数对数组进行随机打乱。最后,我们再次打印输出打乱后的数组。

通过运行以上代码,我们可以看到原始数组和打乱后的数组的输出结果。每次运行结果都会不同,因为Fisher-Yates shuffle算法保证了每个元素被放置在任意的位置上的机会是相等的,从而实现了随机打乱的效果。

原理解析

Fisher-Yates shuffle算法的原理非常简单。首先,我们使用srand函数设置随机数种子,这样可以保证每次运行程序时获得的随机数序列是不同的。然后,我们从最后一个元素开始,逐步遍历到第一个元素。在每一次遍历中,我们生成一个随机位置j,这个位置的范围是从0到当前遍历位置i。然后,我们将当前遍历位置i的元素与随机位置j的元素进行交换。这样,当前遍历位置i的元素就被放置在了随机的位置上。通过不断进行这样的交换操作,我们就能够实现数组的随机打乱。

Fisher-Yates shuffle是一种常用的算法,可以实现对数组或列表的随机打乱。在本文中,我们给出了Fisher-Yates shuffle算法的C语言实现,并提供了一个简单的案例代码,展示了打乱前后数组的输出结果。通过理解和应用Fisher-Yates shuffle算法,我们可以在编程中产生更多的随机性,增加程序的灵活性和趣味性。