洗牌算法

生成20个随机数字,该组数字中包含21-10之间的整数,即包含2122,依次类推,但是每个数字的位置是随机的。

   //生成2组1-10之间的规则数字

        int num[] = new int[20];

        for(int i = 0;i < num.length;i++){

            num[i] = i / 2 + 1;

        }

        //随机打乱数字顺序

        Random r = new Random();

        int times = 30; //两两交换次数

        int ranIndex;   //随机下标

        int temp;       //交换变量

        int cIndex;     //当前下标

        for(int i = 0;i < times;i++){

            ranIndex = r.nextInt(20); //[0-20]之间的随机数,作为下标

            //和下标i % 20交换

            cIndex = i % 20;

            if(cIndex != ranIndex){

                temp = num[cIndex];

                num[cIndex] = num[ranIndex];

                num[ranIndex] = temp;

            }

        }

 

首先生成一组规则的数字,然后随机打乱改组数字的顺序。使用这种思路,程序的执行效率很稳定,而且实现起来比较简单。

实现的具体步骤是,首先生成两组1-10之间的整数,按照1,1,2,2,……这样的顺序依次赋值到数组中,这样得到的是一个规则的数组num,这个数组中包含所有需要的数字,即2组1-10之间的数字,但是数字的顺序是规则的。接着使用两两交换的方式随机交换数组中数字的位置,交换的方法是生成一个0到数组长度(不包含)的随机数字,作为一个数组交换时的下标,然后和数组当前的下标,即第一次下标为0,第二次下标为1,的元素进行交换,这样经过一定次数的交换以后,数组中的数字位置就变得随机了。而每次的交换消耗的时间是基本固定的,所以实现起来整个算法的执行效率很稳定,生成的速度也很高效。

实际应用

高效生成随机数组这种算法在实际的程序开发中也大量的进行使用。例如在棋牌类的游戏开发中,例如斗地主、双扣等,在每次游戏开始时,都需要打乱扑克牌的顺序,然后再将打乱以后的扑克牌依次发放给每个游戏玩家。而这种打乱扑克牌顺序的算法通常就被称作洗牌算法。

从程序开发的角度看洗牌算法,实际上生成的就是一组规则的随机数字,例如对于一副扑克牌来说,在程序中如果需要代表一副扑克牌,根据扑克牌的特点(每幅牌包含54张不同的牌)则只需要为每张牌进行编号即可,例如将扑克牌中的每张牌依次对应编号成0-53之间的整数,那么一副牌就是一个包含0-53之间所有整数的数组。而洗牌就是将这样一个规则的数组变成一个随机数组,但是必须包含所有0-53之间的所有整数,这个要求和前面介绍中的算法实现的功能是一致的。

则根据前面介绍的算法,在一副扑克牌的斗地主游戏中实现洗牌的代码如下:

//生成一幅牌,编号为0-53

        int poker[] = new int[54];

        for(int i = 0;i < poker.length;i++){

            poker[i] = i;

        }

        //洗牌

        Random r = new Random();

        int times = 54; //两两交换次数

        int ranIndex;   //随机下标

        int temp;       //交换数字

        int cIndex;     //当前下标

        for(int i = 0;i < times;i++){

            ranIndex = r.nextInt(54); //[0-53]之间的随机数

            //和下标i % 54交换

           cIndex = i % 54;

            if(cIndex != ranIndex){

                temp = poker[cIndex];

                poker[cIndex] = poker[ranIndex];

                poker[ranIndex] = temp;

            }

        }

点评:在该代码中,利用前面介绍的算法首先生成一个包含[0,53]之间所有整数的规则数组poker,然后再使用两两交换的方式对于该数组中的元素交换54次,这个次数可以根据需要进行调整,从而得到了一个符合逻辑要求的数组poker。而对于玩家来说,poker这个数组就是一副被洗过的扑克牌,可以以此为基础进行游戏后续的逻辑的开发了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值