Как получить массив без повторяющихся значений с одной функцией - PullRequest
1 голос
/ 30 октября 2019

Я хочу создать два массива, ни один из них не может иметь повторяющиеся значения, и, если возможно, я ищу ответ в том же цикле.

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), поэтому, когда бы вы ни нашли повторное значение, следующее случайное число не содержит его, но я не могу найти какой-либо способ сделать это таким образом.

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Если диапазон чисел не слишком велик, вы можете создать массив действительных чисел и выбрать случайным образом из него.

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.

В любом случае, это займет короткое постоянное время, вместо того, чтобы проходить всепредыдущие цифры, и повторите попытку, если это окажется дубликатом. Но работает только для довольно небольших числовых диапазонов.

0 голосов
/ 30 октября 2019

Чтобы сгенерировать случайное число в объединении двух интервалов, вы можете использовать:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...