如何打乱一个给定数组?

      在程序开发过程中,有时候需要打乱一组给定的序列,而且每次请求打乱的结果还要求不一样,比如在棋牌等游戏中有这样的需求。
首先,我们定义一个待打乱的数组:
int array[10] = {1,2,3,4,5,6,7,8,9,10};
再定义一个用于存放打乱后数据存放的数组
int DistrubAry[10] = { 0 };

这里有一个从百度扒过来的代码,可以先看一下,我个人还有另外的一种方式,但是其实方法都差不多。

#pragma once
#include 
#include 
using namespace std;
#pragma comment( lib, "winmm.lib" )
int main()
{
    //定义一个数组(自己随便定义,这里以10个大小的数组为例)
    const int iSum = 10;
    int iAry[iSum] = { 3, 7, 5, 87, 23, 1, 65, 8, 51, 64 };
    //定义一个数组用来保存打乱顺序后的数
    int iDistrubAry[iSum] = { 0 };
    //播随机种子(以便每次随机的值有相等的机会)
    srand(timeGetTime());
    //每次随机的不相同的数存到这个数组里(以便下次随机时判断随机的数是否已经随机过了)
    int iRandomData[iSum] = { 0 };
    //将iRandomData元数都赋初值为-1,表示没有产生一个随机数
    for (int i = 0; i1;
    }
    //共产生不同的随机的个数
    int iRandomSum = 0;
    //打乱这个数组
    for (int i = 0; i//随机一个数
        int iRandom = rand() % iSum;
        //判断iRandomSum是否为0,是0的话表示没有随机过任何数,就不用查询是否随机到这个数了
        if (iRandomSum != 0)
        {
            //用来判断是否连续随机(当随机的数与之前随机的有重复时就连续随机)
            for (int i = 0; iif (iRandom == iRandomData[i])
                {
                    iRandom = rand() % iSum;
                    //i要赋值为-1,表示重新查询是否与以前随机的数重复
                    i = -1;
                }
            }
        }
        //将产生的随机数添加到RandomData里面
        iRandomData[iRandomSum] = iRandom;
        //将随机的数作为原来数组的索引,取出原来数组此索引的值保存在打乱后的数组中
        iDistrubAry[iRandomSum] = iAry[iRandom];
        //将iRandom加1,表明已经打乱好了一个数
        iRandomSum++;
    }
    //显示未打乱的数组
    cout << "未打乱的数组:";
    for (int i = 0; icout << iAry[i] << "  ";
    }
    cout << endl;
    //显示打乱后的数组
    cout << "打乱后的数组:";
    for (int i = 0; icout << iDistrubAry[i] << "  ";
    }
    cout << endl;
    system("pause");
}

你可能感兴趣的:(C/C++)