完美洗牌算法

       今天在编写贪吃蛇时,遇到出现随机食物,且食物不能重复的问题。这里想到了经典的洗牌算法。

首先介绍一下洗牌规则:随机分配52张扑克牌到52个位置上,每个位置只容许放一张牌,这和出现随机食物,且不能重复类似。我想到了以下方法:

1 使用随机函数,每次直接让随机函数在已给的范围内取数。判断每次取得的数是否,已经取出过,如果取出过重新再取,再到取到的数不与前面的重复;(不建议使用)

   优点:不需要存储整副扑克,资源小,在牌数少的情况下,性能比较好。
   缺点:随着已出现扑克牌的数量越来越多,取得数重复概率会增加,重复的操作会明显增加,当已现扑克牌的数量50%时就越发明显。

 2 ,申请一个数组空间,大小为要取的数的范围大小。遍历该数组让数组每个元素的值为该下标的值。使用随机函数取值,取到值,则取到该值所对应的下标的空间里的值;该值为我们所用的随机数,取完后将该空间,与末位空间的值交换,让下次随机取值范围减一,再在减一后的范围内随机取值,这样就可以避免取到所取过的值。(贪吃蛇食物产生采用该方法)代码如下

优点:直接从未取得的数中随机取数,不需要额外的计算牌是否的重复,编写程序也会方便一些。但在一些实时性强的环境下,还是采用该方法。提高用户体验度。
缺点:需要专门一个数组或者集合空间来储存扑克牌,资源稍大一点。

头文件<stdlib.h> <time.h>

for(index = 0; index < 2000; index++){
        arr[index] = index;

}

srand((unsigned)time(NULL));

for(i = 0, j = 2000; i < 100; i++){
        index = arr[(rand() % (j - 0)) + 0];
        arr[index] = a[j];
        arr[j] = -1;
        j--;
        printf("%d ",index);
}

3 多次随机两张牌交换,以达到牌与牌位置混淆的结,由于是完整的牌间位置调换,所以避免了校验牌的过程。

具体用那种方法最完美,依据情况来看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值