在程序开发过程中,有时候需要打乱一组给定的序列,而且每次请求打乱的结果还要求不一样,比如在棋牌等游戏中有这样的需求。
首先,我们定义一个待打乱的数组:
int array[10] = {1,2,3,4,5,6,7,8,9,10};
再定义一个用于存放打乱后数据存放的数组
int DistrubAry[10] = { 0 };
这里有一个从百度扒过来的代码,可以先看一下,我个人还有另外的一种方式,但是其实方法都差不多。
#pragma once
#include <iostream>
#include <Windows.h>
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; i<iSum; i++)
{
iRandomData[i] = -1;
}
//共产生不同的随机的个数
int iRandomSum = 0;
//打乱这个数组
for (int i = 0; i<iSum; i++)
{
//随机一个数
int iRandom = rand() % iSum;
//判断iRandomSum是否为0,是0的话表示没有随机过任何数,就不用查询是否随机到这个数了
if (iRandomSum != 0)
{
//用来判断是否连续随机(当随机的数与之前随机的有重复时就连续随机)
for (int i = 0; i<iRandomSum; i++)
{
if (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; i<iSum; i++)
{
cout << iAry[i] << " ";
}
cout << endl;
//显示打乱后的数组
cout << "打乱后的数组:";
for (int i = 0; i<iSum; i++)
{
cout << iDistrubAry[i] << " ";
}
cout << endl;
system("pause");
}