一步一步写算法(之洗牌算法)

来源:互联网 发布:mac保存图片快捷键 编辑:程序博客网 时间:2024/06/08 06:17

  扑克牌洗牌是我们生活中比较喜欢玩的一个游戏。那么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c运行库当中有一个随机函数rand,它可以生成0~32767之间的任意数。那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢?

    在这里我抛砖引玉一下,谈一谈自己目前已经看到的两个算法。欢迎朋友们谈一谈其他的方法。

    (1)全局洗牌法

    步骤如下所示:

    a)首先生成一个数组,大小为54,初始化为1~54

    b)按照索引1到54,逐步对每一张索引牌进行洗牌,首先生成一个余数 value = rand %54,那么我们的索引牌就和这个余数牌进行交换处理

    c)等多索引到54结束后,一副牌就洗好了

    代码如下所示:

[cpp] view plaincopy
  1. void get_rand_number(int array[], int length)  
  2. {  
  3.     int index;  
  4.     int value;  
  5.     int median;  
  6.   
  7.     if(NULL == array || 0 == length)  
  8.         return ;  
  9.   
  10.     /* 每次发牌的时候任意分配待交换的数据 */  
  11.     for(index = 0; index < length; index ++){  
  12.         value = rand() % length;  
  13.   
  14.         median = array[index];  
  15.         array[index] = array[value];  
  16.         array[value] = median;  
  17.     }  
  18. }  


    (2)局部洗牌法

    上面的算法非常简单,但是有一个问题,我们发现每次洗牌之后原来洗好的牌都会进行二次操作,个人觉得有点说不过去,所以不妨加以改进:

    a)同样,首先我们生成一个大小为54的数组,数组排列为1~54

    b)索引牌从1开始,到54结束。这一次索引牌只和剩下还没有洗的牌进行交换, value = index + rand() %(54 - index)

    c)等到所有的索引牌都洗好之后,一副牌就弄好了

    代码如下所示:

[cpp] view plaincopy
  1. void get_rand_number(int array[], int length)  
  2. {  
  3.     int index;  
  4.     int value;  
  5.     int median;  
  6.       
  7.     if(NULL == array || 0 == length)  
  8.         return ;  
  9.       
  10.     /* 发牌的时候对于已经分配的数据不再修改 */  
  11.     for(index = 0; index < length; index ++){  
  12.         value = index + rand() % (length - index);  
  13.           
  14.         median = array[index];  
  15.         array[index] = array[value];  
  16.         array[value] = median;  
  17.     }  
  18. }  

注: 以上两个算法都不是我想出来的,欢迎算法的初始作者和我联系,我会在文章中添加标记说明。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾驶证照片泡水不清楚怎么办 驾驶证过了180天怎么办 天津有公司执照怎么办落户 温州车在上海年审手续怎么办 广东小高考考了d怎么办 深圳开摩托抓到怎么办 深圳车卖了车牌怎么办 a1驾照时期过了怎么办 b1驾照扣了12分怎么办 北京的驾照换证怎么办 b2汽车驾驶证年审过期几天怎么办 上海驾照到期人在外地怎么办 交警开的罚单交不了怎么办 珠海交警微信交罚单扣分怎么办 驾驶证违法罚款单子没有了怎么办 转账密码输错3次怎么办 汽车违章扣6分怎么办 汽车扣了72分年检怎么办 汽车扣了50分怎么办 汽车扣了15分怎么办 汽车扣了27分怎么办 汽车扣了40分怎么办 行驶证掉了怎么办 异地 高速上没带驾驶证行驶证怎么办 身份证驾驶证行驶证都丢了怎么办 驾驶证年审过期一个月怎么办 柴油车辆年检尾气不合格怎么办 驾驶证过期了5天怎么办 过了审车时间怎么办 骑车没带行驶证怎么办 轿车行驶证丢了怎么办 车子没年检被扣怎么办 上海车辆年检过期了怎么办 行驶证过期十天怎么办 行驶证盖章满了怎么办 驾照c证扣12分怎么办 两年小车忘年审怎么办 4年车检过期了怎么办 车检过期了1周怎么办 超过检车几天了怎么办 驾驶证扣两个6分怎么办