洗牌算法

洗牌即产生指定数据的随机序列 第一种思路: 将54个数依次放到随机的位置。关键是每次找一个随机的位置。 下面是找这个随机位置的算法: 1、用一个Bool型数组记录各个位置是否已经放置了数,如果放置则置true,没有则为false。在算法开始时数组初始化为false。 2、每次产生一个0~53的随机数,看这个位置是否已经放置了数,如果已经放置了,则继续用同样的方法找一个随机位置判断;如果这个位置还未放置,则设置此位置,并标记其已经放置。 3、反复执行(2)直到所有的位置都放置了数为止。(只要设置成功54次数就说明所有位置已经设置了数) 例程: void shuffle(int dest[],int n) { int pos,card; memset(dest,0,sizeof(int)*n); for(card=1;card<=n;card++) { do { pos=rand()%(n+1); }while(dest[pos]!=0); dest[pos]=card; } } 上面方法的问题:随着未设置的数渐渐变少,寻找未设置的位置会越来越难。如果牌数很多则更是不可思议。 第二种思路: 随机分配54张扑克牌到54个位置,每个位置只允许放一张牌。用1-13表示红心 A-K,14-26表示黑桃A,2,3-,Q,K,27-39表示方块A,2,3-,Q,K,40-54表示A,2,3-,Q,K,大鬼,小鬼 也就是生成1-52个不重复的随机数,放到数组中。 #include #include #include const int N=54; static int a[N]; int create(int n) { return (1+rand()%54); } int main() { int i,j; srand(time(0)); for(i=1;i<=N;++i) { a[i]=create(N); for(j=0;j
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值