如何打乱一个给定数组?

      在程序开发过程中,有时候需要打乱一组给定的序列,而且每次请求打乱的结果还要求不一样,比如在棋牌等游戏中有这样的需求。
首先,我们定义一个待打乱的数组:
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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值