洗扑克牌(扑克牌排序或乱数排序)

本文介绍了一种对52张扑克牌进行打乱排序的方法,通过遍历数组并用随机数交换元素位置,避免了重复生成随机数导致的效率降低。同时,提出了利用数字除以13来确定花色和数字的判断方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洗扑克牌(扑克牌排序或乱数排序)

题目:对52张扑克牌打乱排序(不包括大小王)

思路:一般的思路是随机产生1到52的随机数,但随机数会重复,重复的次数越多,程序的运行速度越慢。所以我们可以将1到52依次存入数组,在遍历数组的同时随机产生1~52的随机数,以随机数作为数组下标,和当前的数交换,及通过乱排序位置来打乱牌的顺序,而不是直接打乱牌的顺序

至于牌的类别判断,可由数字除以13,由商判断花色,由余判断扑克牌数子

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 52
using namespace std;


int main()
{
    int poker[maxnum],j,tmp;
    for(int i=0; i<maxnum; i++)
    {
        poker[i] = i+1;
    }
    for(int i=0; i<maxnum; i++)
    {
        j = rand()%52;
        tmp = poker[i];
        poker[i] = poker[j];
        poker[j] = tmp;
    }
    for(int i=0; i<maxnum; i++)  //判断花色
    {
        switch((poker[i]-1)/13) //减去1在除以13,以便将52/13=4计算在内
        {
            case 0: cout<<"黑桃";break;
            case 1: cout<<"红心";break;
            case 2: cout<<"方块";break;
            case 3: cout<<"梅花";break;
        }
        switch(poker[i]%13)
        {
            case 0: cout<<"K";break;
            case 12: cout<<"Q";break;
            case 11: cout<<"J";break;
            default: cout<<poker[i]%13;break;
        }
        cout<<" ";
        if((i+1)%13 == 0)
            cout<<endl;
    }
    return 0;
}

博客持续更新中,欢迎留言交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值