Отбрось этот код, серьезно. Вам нужен алгоритм тасования, а не фрагмент кода, который проверяет старые значения на наличие дубликатов. Делая это по-своему, в конечном итоге вам понадобится все больше и больше времени, когда ваш бассейн закончится. Преимущество алгоритма тасования заключается в том, что он не ухудшается при уменьшении пула.
Вот фрагмент кода, который я использовал при ответе на другой вопрос. Он поддерживает список чисел и, когда возвращает вам случайное число, удаляет его из списка и уменьшает счетчик для следующего случайного выбора.
#include <stdio.h>
#include <stdlib.h>
#define ERR_NO_NUM -1
#define ERR_NO_MEM -2
int myRandom (int size) {
int i, n;
static int numNums = 0;
static int *numArr = NULL;
// Initialize with a specific size.
if (size >= 0) {
if (numArr != NULL)
free (numArr);
if ((numArr = malloc (sizeof(int) * size)) == NULL)
return ERR_NO_MEM;
for (i = 0; i < size; i++)
numArr[i] = i;
numNums = size;
}
// Error if no numbers left in pool.
if (numNums == 0)
return ERR_NO_NUM;
// Get random number from pool and remove it (rnd in this
// case returns a number between 0 and numNums-1 inclusive).
n = rand() % numNums;
i = numArr[n];
numArr[n] = numArr[numNums-1];
numNums--;
if (numNums == 0) {
free (numArr);
numArr = 0;
}
return i;
}
int main (void) {
int i;
srand (time (NULL));
i = myRandom (20);
while (i >= 0) {
printf ("Number = %3d\n", i);
i = myRandom (-1);
}
printf ("Final = %3d\n", i);
return 0;
}
Пример вывода показывает это в действии:
Number = 19
Number = 10
Number = 2
Number = 15
Number = 0
Number = 6
Number = 1
Number = 3
Number = 17
Number = 14
Number = 12
Number = 18
Number = 4
Number = 9
Number = 7
Number = 8
Number = 16
Number = 5
Number = 11
Number = 13
Final = -1
Называйте его с неотрицательным размером пула, и он устанавливает новую последовательность и возвращает первое случайное значение. После этого вы можете позвонить по номеру -1
, и он получит следующий случайный уникальный номер из пула. Когда пул исчерпан, он вернет -1.
Другой ответ , содержащий этот код, имеет версию, которая также может поддерживать несколько пулов, если вы хотите использовать эту функцию в многопоточном коде.