鱼C论坛

 找回密码
 立即注册
查看: 1602|回复: 3

[已解决]如何在[M,N]的范围内生成k个不重复的随机数

[复制链接]
发表于 2018-12-22 20:11:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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[k];
        for (i = 0; i < k; i++)
        {
                a = M + rand() % (N - M + 1);
               
for (j = 0; j < i; j++)
                {
                        
                        while (a == a[j])
                        {
                                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[j])
                        {
                                t = a;
                                a = a[j];
                                a[j] = t;
                        }
                }
        }
        printf("\n");
        for (i = 0; i < k; i++)
        {
                printf("%d\n", a);
        }
        printf("\n");
        
        system("pause");
        return 0;


程序的流程是让当前的一个数组元素获得一个随机数,然后跟前面所有的元素 一 一 进行比较,如果出现相同,则当前第i个数组元素重新获得一个随机数,直到不相同为止,让下一个数组元素获得一个随机数,然后再跟前面的元素 一 一 进行比较。

我感觉这个流程应该没有问题,可还是会有相同的数字出现。
最佳答案
2018-12-22 21:33:34
如果你外层是for的话,内层应该是while生成成功再跳出
你两层都是for逻辑就不对啊,你思路跟着你的程序跑一边,
假设时候a[0]=0 a[1]=1 i=2
随机生成a[2]=0
开始遍历
j=0
因为a[2]==a[0]
重新生成a[2]=1
继续j=1
因为a[2]==a[1]
重新生成a[2]=0;
j=2==i 跳出for

这时候a[0]=0 a[1]=1 a[2]=0


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[k];
        for (i = 0; i < k; i++)
        {
                a[i] = M + rand() % (N - M + 1);
                for (j = 0; j < i; j++)
                {
                       
                        while (a[i] == a[j])
                        {
                                a[i] = M + rand() % (N - M + 1);
                        }
                }
               

               
        }
        for (i = 0; i < k; i++)
        {
                printf("%5d", a[i]);
        }
        printf("\n");
        for (i = 0; i < k - 1; i++)
        {
                for (j = i+1; j < k; j++)
                {
                        if (a[i] > a[j])
                        {
                                t = a[i];
                                a[i] = a[j];
                                a[j] = t;
                        }
                }
        }
        printf("\n");
        for (i = 0; i < k; i++)
        {
                printf("%d\n", a[i]);
        }
        printf("\n");
       
        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-22 20:24:24 | 显示全部楼层
代码有问题,请看2楼。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-22 21:33:34 | 显示全部楼层    本楼为最佳答案   
如果你外层是for的话,内层应该是while生成成功再跳出
你两层都是for逻辑就不对啊,你思路跟着你的程序跑一边,
假设时候a[0]=0 a[1]=1 i=2
随机生成a[2]=0
开始遍历
j=0
因为a[2]==a[0]
重新生成a[2]=1
继续j=1
因为a[2]==a[1]
重新生成a[2]=0;
j=2==i 跳出for

这时候a[0]=0 a[1]=1 a[2]=0


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-1 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表