洗牌算法

今天把学习中用到的洗牌算法好好看了看,把自己感觉最易懂的和最经典的一种分享出来,当然,我这个是看过别人之后自己写的。

我们以扑克牌当做例子,一共有54张,如何一次就把排序全部打乱呢?

1、最笨的洗牌算法:

先把54张牌按照顺序排好,每次取一个0-54的随机数,根据随机数取出该牌,放入新的牌序中,这样经过54次大循环就组成了洗过的牌。但是这种办法的缺点就是每次取随机数的时候可能会取到之前已经取过的牌,所以需要做一个比较,如果该牌已经被取过,则重新取随机数。

2、过滤之后的洗牌算法

这种方法就是比第一种算法多加了一个数组,每次从该数组中取一张卡牌,每次取过就少一张,这样就使得循环的次数变得很简单,只是来回取数比较麻烦。

3、单数组取数的洗牌算法

这个算法网上已经有了,我觉得很好,就拿过来说下,不过不知道原作是谁。就是按照顺序或倒序从卡牌中取一张牌,然后从剩下的牌中随机再取,这样做一个循环,代码如下(C#写的):

 

    class Shuffle_algorithm//洗牌算法
    {
        static void Main(string[] args)
        {
            int[] card = new int[54];//54张牌
            Random random = new Random();//随机数


            for (int i = 0; i < card.Length; i++)//把牌按顺序牌好
                card[i] = i;


            for (int i = 0; i < card.Length; i++)//洗牌
            {
                //从第0张开始,取顺序为0的牌,从053随机取一张牌放到第0张处
                //下一章取顺序为1的牌,从1到53随机取一张牌放到第1张处,以此类推
                int j = random.Next(i, card.Length - 1);
                int temp = card[i];
                card[i] = card[j];
                card[j] = temp;
            }


            for(int i=0;i<card.Length;i++)//安装顺序输出洗过的牌
                System.Console.Write(card[i] + " ");


            System.Console.ReadLine();//做个停顿
        }
    }

转载于:https://my.oschina.net/u/3823956/blog/1787193

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值