C语言实现0~999洗牌,要求每次洗牌结果不一样,下面这段程序中基本可以实现,但是会有重复和丢失,请教高
发布网友
发布时间:2022-05-24 12:07
我来回答
共2个回答
热心网友
时间:2023-10-12 18:57
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define ARR_SIZE 1000
int main()
{
int a[ARR_SIZE] = {0};
int nPos;
int *pLast;
int i;
nPos = 0;
pLast = a + ARR_SIZE - 1;
srand((unsigned int)time(NULL));
for (i=0; i<ARR_SIZE; i++)
{
nPos = (pLast == a) ? 0 : rand() % (pLast - a);
if (a[nPos])
{
*pLast = i;
if (i<ARR_SIZE - 1)
while(*(--pLast) && pLast>a);
}
else
{
a[nPos] = i;
}
}
for (i=0; i<ARR_SIZE; i++)
{
printf("%03d\t", a[i]);
}
//getchar();
return 0;
}
热心网友
时间:2023-10-12 18:57
根据你的代码,做了修改:主要是你判断重复的那个地方处理的有问题
#include<iomanip.h>
#include<stdlib.h>
#include<time.h>
const int N=100;
static int a[N];
int create(int n)
{
return (rand()%N);
}
int main()
{
int i,j;
srand(time(0));
for(i=0;i<N;i++)
{
a[i]=create(N);
for(j=0;j<=i;j++)
{
if(a[j]==a[i])
{
break;
}
}
if (j!=i)
{
i--;
continue;
}
//cout<<a[i]<<"\t";
cout <<setfill('0')<<setw(3) <<a[i]<<"\t";
}
cout<<endl;
return 0;
}