linux c练习 设计一个洗牌发牌的程序

本文解析了一个使用C语言实现的洗牌与发牌程序。重点介绍了如何利用srand和rand函数生成伪随机数,并结合当前系统时间实现真正的随机效果。此外还详细解释了发牌逻辑,包括使用数组记录每张牌的状态。

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

#include<stdlib.h>
#include<time.h>    //这两个头文件与随机函数及其设置有关
#include <stdio.h>
int main ()
{
	int i, n;
	int count[52]={0};         //数组初始化
	srand((unsigned int)time(NULL));           //随机函数调用前的设置,产生随机序列

	for (i=0; i<52;i++)     
	{
		n=rand()%52;                 //随机函数调用,即产生52以内的随机数
		while (count[n]==1)          //设定一个判定值,若符合则跳过继续随机
		{
			n=rand()%52;
		}
		count[n]=1;                //该数随机操作完后,给他赋一个判定值,下一次不会对该数操作。
		if (n<13)
		{
			printf (" 红心%2d",n+1);
		}
		else if(n>=13 && n<26)
		{
			printf (" 黑桃%2d",n-12);
		}
		else if (n>=26 && n<39)
		{
			printf (" 梅花%2d",n-25);
		}
		else 
		{
	 		printf (" 方片%2d",n-38);             //洗牌完毕后的发牌操作
		}
		if (0==(i+1)%13)                  //输出美观,每13个换行
		{
			printf ("\n");
		}
		
	}
	return 0;
}

设计一个洗牌、发牌的小程序

这个程序转自一名博主,链接如上,不过他的程序少了随机函数和时间函数的头文件,所以在编译时候会警告。

  • 该程序的一个重点是随机函数,我在此以前没有怎么接触过随机函数,所以看到 srand((unsigned int)time(NULL));
    这一行代码时候很懵,我参看了这名博主的文章 随机函数的rand、srand用法

    关于随机函数,我的理解是,srand起到初始设置的作用,即产生随机数供rand调用。随机函数也并没有我刚看到时所想的那么玄乎。这也就是个函数,如srand(10),这个10是个函数参数,(作为随机函数产生随机数的启动值),然后通过内部算法以10为起点产生随机数,所以一个启动值所产生的随机值是固定的,可以从数学上函数的自变量和因变量的角度理解,所以这样的随机值并不随机,称为“伪随机”。

    而这里的代码,srand里的参数是一个和time相关的函数,time函数可以理解为可以目前系统时间的函数,由于时间是不断变化的,所以不同时刻srand的启动值也在变化,故而产生的随机数也在不断改变。可以做到
    “真正” 的随机.

  • 以上的可以算作是洗牌操作,那么另一个重点就是发牌。主要做法是把52张排放到数组的52个位置对应中,先全部初始化,每发一张牌就对数组对应位置赋值,下次随机到它就会跳过。

    具体语句分析:
    while语句中先判断数组中数的值是否为1,如果数组这个位置已经被随机操作过就会被赋值1,在题目中就是,这张牌已经被发出去了,1值就是用于标志它已经被发了出去,所以要在while语句里重新调用随机函数。下面一连串的if和else语句判断就是把数组中的各个位置与具体的牌联系起来了,如红心是数组中第一到第十三位置表示的。

以上便是我对这个程序的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值