最近老师布置了一个题目:
(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次,循环的运算总共也只有几百次,时间虽说缩短了,但是感觉还是要等一会才出结果,这是为什么呢?希望有读者可以继续改进。