如何在[M,N]的范围内生成k个不重复的随机数
本帖最后由 kkk222 于 2018-12-22 20:22 编辑#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned)time(NULL));
int i, k, M, N, j, t;
scanf("%d", &M);
scanf("%d", &N);
k = rand() % (N - M) + 2;
printf("k=%d\n", k);
int a;
for (i = 0; i < k; i++)
{
a = M + rand() % (N - M + 1);
for (j = 0; j < i; j++)
{
while (a == a)
{
a = M + rand() % (N - M + 1);
}
}
}
for (i = 0; i < k; i++)
{
printf("%5d", a);
}
printf("\n");
for (i = 0; i < k - 1; i++)
{
for (j = i+1; j < k; j++)
{
if (a > a)
{
t = a;
a = a;
a = t;
}
}
}
printf("\n");
for (i = 0; i < k; i++)
{
printf("%d\n", a);
}
printf("\n");
system("pause");
return 0;
程序的流程是让当前的一个数组元素获得一个随机数,然后跟前面所有的元素 一 一 进行比较,如果出现相同,则当前第i个数组元素重新获得一个随机数,直到不相同为止,让下一个数组元素获得一个随机数,然后再跟前面的元素 一 一 进行比较。
我感觉这个流程应该没有问题,可还是会有相同的数字出现。
代码有点问题,重新发一下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned)time(NULL));
int i, k, M, N, j, t;
scanf("%d", &M);
scanf("%d", &N);
k = rand() % (N - M) + 2;
printf("k=%d\n", k);
int a;
for (i = 0; i < k; i++)
{
a = M + rand() % (N - M + 1);
for (j = 0; j < i; j++)
{
while (a == a)
{
a = M + rand() % (N - M + 1);
}
}
}
for (i = 0; i < k; i++)
{
printf("%5d", a);
}
printf("\n");
for (i = 0; i < k - 1; i++)
{
for (j = i+1; j < k; j++)
{
if (a > a)
{
t = a;
a = a;
a = t;
}
}
}
printf("\n");
for (i = 0; i < k; i++)
{
printf("%d\n", a);
}
printf("\n");
system("pause");
return 0;
} 代码有问题,请看2楼。 如果你外层是for的话,内层应该是while生成成功再跳出
你两层都是for逻辑就不对啊,你思路跟着你的程序跑一边,
假设时候a=0 a=1 i=2
随机生成a=0
开始遍历
j=0
因为a==a
重新生成a=1
继续j=1
因为a==a
重新生成a=0;
j=2==i 跳出for
这时候a=0 a=1 a=0
页:
[1]