📜  Fisher-Yates shuffle 算法 c++ (1)

📅  最后修改于: 2023-12-03 14:41:13.108000             🧑  作者: Mango

Fisher-Yates Shuffle 算法介绍

Fisher-Yates Shuffle 算法也被称为 Knuth Shuffle 算法,是一种用于将数组或列表中的元素随机排序的算法。该算法的时间复杂度为 O(n),其中 n 是要洗牌的元素个数。

算法原理

Fisher-Yates Shuffle 算法的原理非常简单,它通过遍历数组中的每一个元素,将当前元素与数组中的一个随机位置的元素进行交换,从而实现洗牌的效果。具体步骤如下:

  1. 从最后一个元素开始,逐个向前遍历数组。
  2. 对于当前遍历到的元素,生成一个随机的索引,范围是当前元素到数组起始位置之间的任意整数。
  3. 将当前元素与随机索引指向的元素进行交换。

通过以上步骤,我们可以保证遍历到的元素都可以与它后面的任意元素进行交换,从而达到随机排序的效果。

算法实现

下面是 Fisher-Yates Shuffle 算法的 C++ 实现:

#include <iostream>
#include <vector>
#include <random>

void fisherYatesShuffle(std::vector<int>& nums) {
    int n = nums.size();
    std::random_device rd;
    std::mt19937 gen(rd());

    for (int i = n - 1; i > 0; --i) {
        std::uniform_int_distribution<int> dis(0, i);
        int j = dis(gen);
        std::swap(nums[i], nums[j]);
    }
}

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    fisherYatesShuffle(nums);

    for (int num : nums) {
        std::cout << num << " ";
    }

    return 0;
}

以上代码中,我们使用了 <random> 头文件中的随机数生成器 std::mt19937std::uniform_int_distribution 来生成随机索引。通过调用 std::swap() 函数来交换元素。最后我们在 main() 函数中演示了如何使用该算法对一个整数数组进行洗牌,并输出结果。

总结

Fisher-Yates Shuffle 算法是一种简单且高效的洗牌算法,通过利用随机数生成器,可以将数组或列表中的元素随机排序。它的时间复杂度为 O(n),适用于各种编程语言和数据结构。