i3geek.com
闫庚哲的个人博客

简述洗牌算法

扑克牌一共有54张,洗牌是将扑克牌顺序打散。那么问题很简单,设计一个算法,实现洗牌的功能,利用自带的RAND函数

全局洗牌

  1. 初始化一个数组,大小为54,初始化值为1~54
  2. 按照索引1到54,逐步对每一张索引牌进行洗牌
    首先生成一个随机数 value = rand %54,再将索引值和该随机数的内容交换
  3. 等到索引到54最后一个结束后,一副牌就洗好了
void get_rand_number(int array[], int length)  
{  
    int index;  
    int value;  
    int median;  
  
    if(NULL == array || 0 == length)  
        return ;  
  
    /* 每次发牌的时候任意分配待交换的数据 */  
    for(index = 0; index < length; index ++){  
        value = rand() % length;  
  
        median = array[index];  
        array[index] = array[value];  
        array[value] = median;  
    }  
}

局部洗牌

全局洗牌的问题是,由于是遍历1-54,部分牌会出现重复交换,可能会产生问题。那么更好的解决办法就是,当前牌和之后的牌中随机交换。

  1. 初始化一个数组,大小为54,初始化值为1~54
  2. 索引牌从1开始,到54结束。这一次索引牌只和剩下还没有洗的牌进行交换, value = index + rand() %(54 – index)
  3. 等到所有的索引牌都洗好之后,一副牌就弄好了
void get_rand_number(int array[], int length)  
{  
    int index;  
    int value;  
    int median;  
      
    if(NULL == array || 0 == length)  
        return ;  
      
    /* 发牌的时候对于已经分配的数据不再修改 */  
    for(index = 0; index < length; index ++){  
        value = index + rand() % (length - index);  
          
        median = array[index];  
        array[index] = array[value];  
        array[value] = median;  
    }  
}
赞(1)
未经允许不得转载:爱上极客 » 简述洗牌算法
分享到: 更多 (0)

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    http://www.bcoder.cn 来访了! 可以交换有链吗

    三顾茅庐3年前 (2016-02-12)回复
  2. #2

    [/钱]领教了

    悬梁刺股3年前 (2016-02-16)回复