C 如何使用一个函数获得无重复值的数组

C 如何使用一个函数获得无重复值的数组,c,arrays,loops,for-loop,random,C,Arrays,Loops,For Loop,Random,我想创建两个数组,它们都不能有重复的值,如果可能的话,我会在同一个循环中寻找答案 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]

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

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要在两个区间的并集中生成一个随机数,可以使用:

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 num = rand() % ((12-10) - 1) + 10 + 1;
如果您想在间隔之间找到一个值,只需使用

int n = rand() % (DIFFERENCE_BETWEEN_INTERVALS - 1) + END_OF_LOWEST_VALUE_INTERVAL+1;
以你的例子来说:

int n = rand() % 17 + 2;
if (n > 9) n += 2;
int num = rand() % ((12-10) - 1) + 10 + 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 num = rand() % ((12-10) - 1) + 10 + 1;
如果您想在间隔之间找到一个值,只需使用

int n = rand() % (DIFFERENCE_BETWEEN_INTERVALS - 1) + END_OF_LOWEST_VALUE_INTERVAL+1;
以你的例子来说:

int n = rand() % 17 + 2;
if (n > 9) n += 2;
int num = rand() % ((12-10) - 1) + 10 + 1;

如果数字范围不太大,您可能希望创建一个有效数字数组,然后从中随机选择

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;
}
int valid[valid_MAX+1];//假设范围为0到valid_MAX。
for(int valid_idx=0;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\u top=valid\u LEN;
对于(int vector_idx=0;vector_idx
如果您碰巧随机选择了top值,这仍然有效-top值复制到自身上,然后在有效_top递减时消失


无论如何,这将需要一个短的固定时间,而不是循环所有以前的数字,如果它恰好是重复的,则重新尝试。但只适用于相当小的数字范围。

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

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;
}
int valid[valid_MAX+1];//假设范围为0到valid_MAX。
for(int valid_idx=0;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\u top=valid\u LEN;
对于(int vector_idx=0;vector_idx
如果您碰巧随机选择了top值,这仍然有效-top值复制到自身上,然后在有效_top递减时消失


无论如何,这将需要一个很短的固定时间,而不是循环所有以前的数字,如果它恰好是重复的,则重新尝试。但只适用于相当小的数字范围。

我们不需要在
rand()%中使用括号(总间隔成员-1+最低间隔成员)
?我们只需要在(总间隔成员-1)周围使用括号吗,我的错误。我们不需要在
rand()%(总间隔成员-1+最低间隔成员)
中使用括号吗?我们需要,但在(总间隔成员-1)附近,我的错误。