C 扑克牌随机发牌的算法实现与研究

2024-04-10 19:58

本文主要是介绍C 扑克牌随机发牌的算法实现与研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近老师布置了一个题目:

(1)实现函数
/*将1~13随机放入pCards数组里*/
int generate_cards(int [] pCards);
/*根据length将数组打印出来,用table间格*/
int print_cards(int [] pCards, int length);

这道题实现不难,刚看到的时候我搜了搜网上的解答,大多使用随机函数生成一个数比对数组里存在的数,如果相同就舍弃,不同就重新生成,实现如下:

#include<stdio.h>
#include<cstdlib>
#include<time.h>
#define NUM 13

/*将1~13随机放入pCards数组里*/
int generate_cards(int *pCards)
{
    int i=0,j,card,flag=0,count;  /*count是为了查看算法效率*/
 srand((unsigned)time(0));
    while(i<13)
 {
  card=rand()%NUM+1;
  count++;                                /*统计随机函数执行了多少次*/
  for(j=0;j<13;j++)
  {
   if(card==pCards[j])
   {
    flag=1;
    break;
   }
  }
  if(flag==0)
  {
   pCards[i++]=card;
  }
  flag=0;
 }
 printf("%d\n",count);       /*打印随机函数执行的次数*/
 return i;
}

/*根据length将数组打印出来,用table间格*/
int print_cards(int *pCards, int length)
{
 int i;
    for(i=0;i<length;i++)
 {
  printf("%d\t",pCards[i]);
 }
 printf("\n");
 return 0;
}


int main()
{
    int pCards[NUM]={0};
 int *p=pCards;
 generate_cards(p);
 print_cards(p,NUM);
 return 0;
}

编译执行后,发现count已经是一个负数,说明随机函数执行的次数已超过2^64-1次(64位机下)。执行效率较低,交给老师,老实说效率太低,要我进行优化。

在google一番之后,各种优化算法,有的不是很随机,有的说用链表,刚好在学数据结构,我就想用链表做,具体思路:

生成一个链表依次存放1-13,然后然后随机函数random()%num,num初始值为13,执行一次num--,生成一个随机数number,然后取出链表里的第(number+1)个数,再删除链表里的这个数。这样随机函数只执行了13次,但是在调式的过程中,也许是我对链表的删除操作不太熟悉,没有成功。

我突然想到数组,数组可以替代链表,代码也少,操作也简单,所做就做,原理同上,附上代码:

#include<stdio.h>
#include<cstdlib>
#include<time.h>
#define NUM 13

/*全局变量数组用来存放1-13个数*/
int pCards1[13];


/*删除一个card*/
int delete_cards(int *pCards2,int number)
{
 int i,card;
 card=pCards2[number];
 for(i=number;i<(NUM-1) && pCards2[i]!=0;i++)
    {
      pCards2[i]=pCards2[i+1];
 }
 pCards2[i]=0;
 return card;
}

 

/*将1~13随机放入pCards数组里*/
int generate_cards(int *pCards)
{
    int i=0,num=13,number;
 srand((unsigned)time(0));
 while(num>0)
 {
        number=rand()%num;
  num--;
        pCards[i++]=delete_cards(pCards1,number);
 }
 return 0;
}

 

/*根据length将数组打印出来,用table间格*/
int print_cards(int *pCards, int length)
{
 int i;
    for(i=0;i<length;i++)
 {
  printf("%d\t",pCards[i]);
 }
 printf("\n");
 return 0;
}


int main()
{
    int pCards[NUM]={0},i;
 int *p=pCards;
 for(i=0;i<NUM;i++)
 {
  pCards1[i]=i+1;
 }
 generate_cards(p);
 print_cards(p,NUM);
 return 0;
}

 

编译后成功,调试时随机函数确实执行了13次,循环的运算总共也只有几百次,时间虽说缩短了,但是感觉还是要等一会才出结果,这是为什么呢?希望有读者可以继续改进。

这篇关于C 扑克牌随机发牌的算法实现与研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891998

相关文章

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用