[cocos2dx]斗地主制作之洗牌算法

来源:互联网 发布:日式拉面 知乎 编辑:程序博客网 时间:2024/04/28 03:54

做斗地主项目,洗牌算法是一个很重的一步,怎样“洗”的均匀,“洗”的随机,这是非常考究的,算法的优劣就直接会影响效果的好坏。这里我给出一个算法,将0-53这54个数字直接排序,经测试还挺随机的。这里要感谢@灰太龙的指导!这个算法是服务器端用于返回给客户端牌的算法,主要的思想就是不断的换牌,两牌交换位置,如果循环次数增大的话,随机性也会更强,洗牌的效果更好!

Code:

C#:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 随机排序{    class Program    {        static void Main(string[] args)        {            int [] data = new int [54];            for (int i = 0; i < 54; i++)            {                data[i] = i;            }            Console.WriteLine("排序前:");            foreach (int i in data)            {                Console.Write(i + ",");            }            long tick = DateTime.Now.Ticks;            Random random = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));            //牌交换算法            for (int i = 0; i < 54; i++)            {                int t1 = random.Next(0, 54);                int t2 = random.Next(0, 54);                int temp = data[t1];                int data1 = data[t1];                int data2 = data[t2];                data[t1] = data2;                data[t2] = temp;            }            Console.WriteLine("排序后:");            foreach (int i in data)            {                Console.Write(i + ",");            }        }    }}
运行截图:




C++:

void HelloWorld::xipai(){    for (int i=0; i<54; i++) {        data[i] = i;    }    //随机数    //洗牌    for(int i=0;i<54;i++)    {        int t1 = arc4random()%54;        int t2 = arc4random()%54;        int temp = data[t1];        int data1 = data[t1];        int data2 = data[t2];        data[t1] = data2;        data[t2] = temp;    }    printf("洗牌之后:\n");    for (int i =0; i<54; i++) {        printf("%d  ",data[i]);    }}

结果:


会发现还是挺随机的,如果将for循环取大一点就更随机了!

5 1
原创粉丝点击