#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语句判断就是把数组中的各个位置与具体的牌联系起来了,如红心是数组中第一到第十三位置表示的。
以上便是我对这个程序的理解。