【问题标题】:How to obtain an array without repeated values with one function如何用一个函数获得一个没有重复值的数组
【发布时间】:2020-02-25 04:46:02
【问题描述】:

我想创建两个数组,它们都不能有重复的值,如果可能的话,我会在同一个循环中寻找答案。

for(int i=0;i<MAX;i++){//MAX=vector's number of values
            scanf("%d", &vector[i]);//reads the number from the keyboard
            while(j!=i){//Looks for each vector[i] if there is a vector[j], with j<i, with that value already. j starts at 0
                    if(vector[j]==vector[i]){
                            printf("\nWrite another number\n");
                            scanf("%d",&vector[i]);
                            j=0;
                    }
                    else
                            j++;
            }
    }

对于第二个循环,我寻找相同的结果,一组不重复的值,但带有随机数。

for(int i=0;i<MAX;i++){
            vector[i]=(rand()%MAX-MIN+1)+MIN;
            while(j!=i){
                   if(vector[j]==vector[i]){
                            vector[i]=(rand()%MAX-MIN+1)+MIN;;
                            j=0;
                    }
                    else
                            j++;
            }
    }

我一直在尝试用一种方法在两个区间之间生成一个随机数,比如 (2,10)U(12,20),所以每当你找到一个重复的值时,下一个随机数不包含它,但我找不到任何办法这样做。

感谢您的帮助

【问题讨论】:

    标签: c arrays loops for-loop random


    【解决方案1】:

    要在两个区间的联合中生成一个随机数,您可以使用:

    int n = rand() % (TOTAL_INTERVAL_MEMBERS-1) + LOWEST_INTERVAL_MEMBER;
    if (n > MEMBERS_IN_LOWEST_VALUE_INTERVAL) n += INTERVAL_DIFFERENCE;
    

    对于 (2,10) 和 (12,20) 的示例间隔,它将是:

    int n = rand() % 17 + 2;
    if (n > 9) n += 2;
    

    如果你想在间隔之间找到一个值,你可以简单地使用

    int n = rand() % (DIFFERENCE_BETWEEN_INTERVALS - 1) + END_OF_LOWEST_VALUE_INTERVAL+1;
    

    你的例子是:

    int num = rand() % ((12-10) - 1) + 10 + 1;
    

    【讨论】:

    • rand() % (TOTAL_INTERVAL_MEMBERS-1 + LOWEST_INTERVAL_MEMBER) 中不需要括号吗?
    • 我们只是在 (TOTAL_INTERVAL_MEMBERS-1) 附近,我的错误。
    【解决方案2】:

    如果数字范围不是太大,您可能需要创建一个有效数字数组,并从中随机选择。

    int valid[VALID_MAX + 1];  // Assuming range is 0 to VALID_MAX.
    
    for (int valid_idx = 0;valid_idx < VALID_MAX + 1;valid_idx++) {
        valid[valid_idx] = valid_idx;
    }
    

    选择:

    valid_top = VALID_LEN;
    for (int vector_idx = 0;vector_idx < MAX;vector_idx++) {
        // Select from 0 to valid_top-1.
        const int valid_idx = rand() % valid_top;
        vector[vector_idx] = valid[valid_idx];
    
        // Don't allow it to be selected again.
        // Replace this value with the top (still valid),
        // and shrink the valid list so the top value is
        // not listed twice.
        valid[valid_idx] = valid[valid_top - 1];
        valid_top--;
    }
    

    如果您碰巧随机选择了顶部值,这仍然有效 - 顶部值被复制到自身上,然后在 valid_top 递减时消失。

    无论如何,这将花费很短的常数时间,而不是循环遍历所有以前的数字,如果碰巧是重复的,则重新尝试。但仅适用于相当小的数字范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 2013-02-21
      • 2021-04-26
      • 2020-01-01
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多