У меня проблема с генерацией случайных чисел (C) - PullRequest
0 голосов
/ 09 января 2019

Моя проблема в том, что я не могу понять, как убедиться, что функция rand не дает одинаковое число двум разным ячейкам, и если да, то как я могу изменить его, не добираясь до числа, которое уже находится в другой ячейке. if (arr [j]! = -1) потому что у меня была другая функция, которая заполняла некоторые ячейки (-1))

это одна из версий того, как я пытался это сделать (все // остатки от разных попыток)

void fillArr(int arr[], int n)
{
    int i,j=0;
    for (i = 0; i < n; i++)
    {
        while (arr[j] == arr[j + 2] &&j + 2<n)
        {
        //srand(time(NULL));
            if (arr[j] != -1)
            {
                if (j % 2 == 0)
                {

                    arr[j] = rand() % (N - 1);
                    if (arr[j + 2] != -1)
                        arr[j + 2] = rand() % (N - 1);
                    //arr[i] = rand() % (N - 1)-rand()%(i-1);
                    srand(time(NULL));
                }
                else
                {
                    arr[j] = rand() % (N - i);
                    arr[j + 2] = rand() % (N - 1);
                    //arr[i] = rand() % (N - 1) - rand() % (i +1);
                    //srand(time(NULL));
                }
            }
            j++;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы не должны повторно заполнять PRNG в каждой итерации цикла. Вы должны сделать это один раз в начале вашей программы.

Вы получите двойную последовательность чисел, как только у вас будет несколько вызовов до srand(time(NULL)) в секунду. Который не кажется маловероятным в вашем коде.

Для справки:

0 голосов
/ 09 января 2019

Почему в массиве случайных чисел не может быть двух равных чисел?

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

Конечно, в массиве должно быть достаточно уникальных чисел (вы можете проверить это перед началом работы), и теоретически это может занять вечность, но на самом деле этого не происходит.

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