数组随机打乱输出【洗牌算法】

数组随机打乱输出【洗牌算法】_第1张图片

题目:

给一个数组,随机打乱顺序,要求输出100次不重复。

解答

利用洗牌算法(Fisher-Yates算法)实现
1. 创建一个包含不重复元素的数组,可以是连续的整数或者其他不重复的元素。
2. 使用一个循环,重复执行以下步骤100次: a. 从数组的最后一个元素开始,逐个向前遍历数组。 b. 对于当前的元素,生成一个随机数,范围是从0到当前元素的索引。 c. 将当前元素与随机数所对应的元素进行交换。
3. 循环结束后,数组中的元素就被打乱了。

/* 循环输出 times 次
   array 是C++ STL库的一个固定数组类, 定义arr长度为9
*/

void fisherYates(array& arr, int times) {
    while (times--) {
        for (int i = arr.size()-1; i>=2; i--) {
            // 设定一个随机数,范围是[0,i)
            int rd = rand() % (i-1);
            swap(arr[i],arr[rd]);  // 交换位置
            // cout << i << "--"<

分析:

每次输出都在上一轮随机的基础上随机交换 n 次

随机10次的结果:

数组随机打乱输出【洗牌算法】_第2张图片

ACM格式完整代码

#include 
#include 
#include 
using namespace std;

class Solution {
public:
    void printArr(const array& arr) {
        cout << "[";
        for (int i=0; i& arr, int times) {
        // 循环输出 times 次
        while (times--) {
            for (int i = arr.size()-1; i>=2; i--) {
                // 设定一个随机数,范围是[0,n]
                int rd = rand() % (i-1);  // 生成[0,i)随机整数
                swap(arr[i],arr[rd]);  // 交换位置
                //cout << i << "--"< arr = {1,2,3,4,5,6,7,8,9};
    Solution so;
    so.fisherYates(arr, 10);

    return 0;
}

你可能感兴趣的:(算法,开发语言,c++)