C++程序产生0-51一共52个不相等的随机数,error,没有warnings,程序不能运行

来源:百度知道 编辑:UC知道 时间:2024/06/02 17:38:16
程序不能运行就是说只有光标在闪,什么都显示不出来。
我的代码如下:(如果大家有更好的方法,请赐教)
#include <iostream>
#include <ctime>
using namespace std;

void main ()
{
srand(time(NULL));
int num[52];
int i;
int j;
int t;
num[0]=rand()%52;
for(i = 0; i < 52;i++)
{
int flag1=1,flag2=1;
while (flag1)
{
t = rand() % 52;
for (j=0;j<=i;j++)
{
if (num[j]==t)
{
flag2=0;
break;
}
}
if (flag2)
{
flag1=0;
}
}

if((i+1)<52)
num[(i+1)] = t;
}

for(i=0;i<52;i++)
{
cout << i+1 << ' ' << num[i]<<endl;
}
}
是没有error没有warning,上面的代码可能不清晰,大家也可以看下面的:
#include <iostream>
#include <ctime>
using namespace std;

void main ()
{
srand(time(NULL));

程序没问题,但你这样做肯定难出结果的。
每次都有52种可能,但是越往后选中的越少,到最后剩下最后一个的时候就要求有1/52的概率能出来那个While循环。前面的概率依次增加,到底一次是1。假如说有1/n的几率做n次就能出来的话,那么你这样要求52的阶乘次while循环才会有结果,时间复杂度太大。
给你提供个思路:(核心如下)
for(i=0;i<52;i++)//定义个数组,所有的数据从这里来
{
a[i]=i;
}

n=52;
for(i=0;i<52;i++)//选择52次就可以
{
j=rand()%n;//随机的第j个
num[i]=a[j];//把第j个给目标数组
n--;//源数组中数少一个
for(;j<n;j++)//依次前移
a[j]=a[j+1];
}//把这里替换掉你原来的方法,这个的时间复杂度为n平方,很快就出结果