kkk222 发表于 2018-12-22 20:11:57

如何在[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个数组元素重新获得一个随机数,直到不相同为止,让下一个数组元素获得一个随机数,然后再跟前面的元素 一 一 进行比较。

我感觉这个流程应该没有问题,可还是会有相同的数字出现。

kkk222 发表于 2018-12-22 20:16:47

代码有点问题,重新发一下
#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;
}

kkk222 发表于 2018-12-22 20:24:24

代码有问题,请看2楼。

Croper 发表于 2018-12-22 21:33:34

如果你外层是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]
查看完整版本: 如何在[M,N]的范围内生成k个不重复的随机数