扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1、C语言提供了一些库函数来实现随机数的产生。C语言中有三个通用的随机数发生器,分别为 rand函数, random函数, randomize 函数
泽普ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
但是rand函数产生的并不是真意正义上的随机数,是一个伪随机数,是根据一个数,称之为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。
在调用rand函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。
2、例程:
#include "stdio.h"
#includestdlib.h
#includemath.h
int main()
{
char str[13][5]={{"A"},{"2"},{"3"},{"4"},{"5"},{"6"},{"7"},{"8"},{"9"},{"10"},{"J"},{"Q"},{"K"}};
int b[]={1,2,3,4};//1红桃 2黑桃 3放片 4梅花
char str1[5][10]={{"红桃"},{"黑桃"},{"方块"},{"梅花"},{}};
srand(NULL);
int a,c,i;
int arr[17][2]={0};//记录17个数字a[i][0] 表示数字 a[i][1] 表示颜色 一共54张牌,4张 A--K 1大王 1小王 1-4=A 5-8=2 53 =小王 54 大王,产生不重复的17个数字
int k=0;
while(k17)
{
a=rand()%54+1;// a53 时候 a=(a-1)/4;//1-4 =0 5-8 ==1
// printf("%3d",a);
if(a53)
{
a=(a-1)/4;
c=rand()%4;
for(i=0;i17;i++)
{
if(a==arr[i][0]c==arr[i][1])
break;
}
if(i17)
{
arr[k][0]=a;
arr[k][1]=c;
k++;
}
}
if(a==53||a==54)
{
for(i=0;i17;i++)
{
if(a==arr[i][0])
break;
}
if(i17)
{
arr[k][0]=a;
arr[k][1]=4;
k++;
}
}
}
for(i=0;i17;i++)
{
// printf("%s%s\n",str1[arr[i][1]],str[arr[i][0]]);
printf("%d ",arr[i][0]);
}
}
发牌原程序见我的空间(),可选是否包含大小王,可选发牌列数。
以下为改过的版本,不包含大小王(即总数52张),只能发4堆。
另外附加了用户菜单,原程序中不含菜单部分。
代码如下:
---------------------------------------
#include stdlib.h
#include time.h
#include stdio.h
int menu()
{
int choice;
printf("1 发牌/0 退出:");
scanf("%d",choice);
return choice;
}
void main( void )
{
int i1, j, total;
int *iArr;
int tag = 0;
char* pok_C[] = { "黑桃", "红桃", "梅花", "方块" };
char* pok_N[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
if(!menu()) exit(0);
total = 52;
srand( (unsigned)time( NULL ) );
iArr = (int*)malloc(total*sizeof(int));
for( i1=0; i1total; i1++ )
{
iArr[i1]=rand()%total;
if( i1==0 ) continue;
do {
tag = 0;
for( j=0; ji1; j++ )
if( iArr[j] == iArr[i1] )
{
iArr[i1]=rand()%total;
tag = 1;
}
} while( tag==1 );
}
for( i1=0; i1total; i1++ )
{
printf("%s%s\t",pok_C[iArr[i1]%4],pok_N[iArr[i1]%13]);
if(i1%4==3) printf("\n");
}
free(iArr);
}
定义一个结构类型表示一张牌,结构包含3个成员,第一个成员char:取值2,3~K,A表示牌名字,第二个成员int:取值2~14表示牌真实大小。第三个成员:结构链表指针。
写一个初始化函数,定义52大小的结构数组,成员值初值分别和牌对应,遍历数组并将每个元素的链表指针依次指向下一个元素地址。这样得到一个初始链表。(相当于一盒新牌)
所有涉及随机数都用rand函数,洗牌分四份就是循环取随机数m=1~n,n是随循环自减,初值52,直到n变成0。每随一次循环就从初始链表中遍历取出对应第m个节点,并从初始链表中将这个节点断开(既前一个节点指针直接指向后一个节点指针)。每取13张就组成一个新的链表。这样获得4个新链表分别表示4个玩家。
最后出牌就是分别遍历自己的链表,利用循环取牌比较结构数值大小。(取出的牌要从链表断开和上面一样,你把取出节点写成独立函数就能反复使用)。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流