
一道用到数组的C语言编程题,要求用刀随机
楼主可以试下以下程序,可能你的程序产生的随机数方式不一样,我使用的是VS2005,需要使用srand函数,才能产生随机数。
只复制主函数吧,头文件自已加了
void main()
{int s,i=1,j;
int a[32]={0};
bool b[32]={false};
int k=0;
srand( (unsigned)time(NULL)); //VS2005随机数需要这样生成,如果系统不一样,就按照你的系统生成随机数,这个比较简单
a[0]=rand()%32; //把生成的第一个随机数赋给a[0]
while(i<32){ //循环生成32位不相同的随机数
s=rand()%32;
a[i]=s; //把生成的随机数赋给a[i]
if(a[1]==a[0]){a[0]=s;continue;} //判断第数组第1和2项是否相等,若相等,则重新生成随机数,一直到第1项与第2项不相等为止,并且不让i增加
for(j=i-1,k=j;j>=0;j=j-1) //循环判断产生的随机数是否与以前的相同。把j的值赋给k,这样k和j的初值就相同
{if(a[i]!=a[j]) //若产生的随机数不相同,则把计数器k减1,若k减到与j相等,即为-1时,也就是表示a[i]与其前的所有项都不相同。
{k--;}}
if(k==-1){a[i]=s; i++;} //如果k=-1则表示a[i]和以前的所有的值都不相同,所以把产生的随机数赋给a[i]
else a[i]=0; //否则产生的a[i]与以前的数相同,把当前值置0。
}
printf("game player\n");
for(int i=0,j=0;i<16;i++,j=j+2)
{
printf("%d %d-%d\n",i+1,a[j]+1,a[j+1]+1);
}
system("pause");
}
运行结果见下图
rand函数是0~1的小数,你将rand*31则是产生0~31的数。
你用int类型。因为int类型可以截取的。也就是说float类型的3.33
转换成int类型是3。
然后你用循环,不停的随机。你将随机获得的数放入int a[32]的数组里。
第一次随机的时候将数放入a[0]里,然后第二次随机的时候要判断你随机的数数组里有没有(可以用循环判断),如果有则继续随机知道随机的数数组里没有为止。然后将数输出。
这种算法不好,但可以完成你题目的要求。
我讲一下第二个算法,用的是数据结构里的内容,不知道你学过数据结构没有。
:
构建32个空间的链表。List[32]。里面放1~32个数,思路和上面一样。但是不用循环。首先随机,然后将随机的数输出,然后将其从链表中删除。然后第二次随机,用rand*30。然后将随机的数输出,然后将随机得到的数删除。然后第三次随机,用rand*29,依次类推,可以用循环。
随机的数对应的是链表索引。
也就是说 如果 (int)rand*31 得到3的话,则对应的是将list[3]输出,然后将list[3]这个节点删除。然后随机(int)rand*30。如果得到28的话讲list[28]输出,然后删除。
依次循环,这样就不需要第一种方法的循环判断了。
链表的特点是可以将节点删除。而C中数组是不可以的,链表要自己定义。
如:用数据结构的知识第一如下大小为4的链表list
list:
索引: 1 2 3 4
内容: 1 2 3 4
删除2的时候,新链表为:
新索引: 1 2 3
data: 1 3 4
删除1的时候,
新索引: 1 2
data: 3 4
#include <stdlib.h>
#include <time.h>
//int player[32];
int generate()
//随机产生一个1~32的数
{
return rand()%32+1;
}
int equal(int player1,int player2,int i,int play[])
//player1与player2是否已经存在
//已经存在返回0,否则返回1
{
int k=0,cout=0;
for(k;k<i;k++)
{
if(player1==play[k]||player2==play[k])
{
cout=0;
break;
}
cout=1;
}
return cout;
}
int main()
{
int player[32];//存放32个队员
int player1,player2;//一组队员
srand((unsigned)time(NULL));
int i,j=0;
printf("Game\t\tPlayer\n");
for(i=0;i<16;)
{
player1=generate();
player2=generate();
if(player1==player2)continue;
//产生的两个随机数相等,则返回循环继续产生随机数
else
{
player[j]=player1;
player[j+1]=player2;
if(i==0||equal(player1,player2,j,player))
//产生的两个队员还没有进行编排,则将他们进行配对
{
printf("%d\t\t%d - %d\n",i+1,player1,player2);
i++;
j+=2;
}
}
}
return 0;
}
把1-32放到数组中随机的进行交换,就好像是洗牌一样,洗的次数可多可少,当然次数越多越随机。
洗完后,在第1的一般不会是1号,最后的一般不会是32号,既然已经是随机的了,怎么配对都无所谓了。
我就让第1个和第17个,第2个和第18个。。。第16个和第32个配对。
程序如下:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
main()
{
int a=0,b=0,t=0,i;
int game[32];
for(i=0;i<32;i++) game[i]=i+1;
srand( (unsigned)time(NULL));
for(i=0;i<100;i++)/*洗牌100次*/
{ /*每次随机从中抽两个交换次序*/
a=rand()%32;
b=rand()%32;
t=game[a];
game[a]=game[b];
game[b]=t;
}
printf("Game\tPlayers\n");
for(i=0;i<16;i++)
printf("%d\t%d-%d\n",i+1,game[i],game[i+16]);
}