Создание случайных чисел

это мой первый вопрос здесь, я делаю небольшую игру, и для назначения ролей мне нужны случайные числа. У меня есть этот код, но возможно, что числа не повторяются? Благодарю.

void giveroles() { srand(time(NULL)); int r = rand() % i + 1; switch ( r ) { /* ... */ } } 

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

Например:

 int cards[52]; for(int i = 0 ; i < 52 ; i++) { cards[i] = i; } for(int i = 0 ; i < 1000 ; i++) { int r1 = rand()%52; int r2 = rand()%52; int t = cards[r1]; cards[r1] = cards[r2]; cards[r2] = t; } for(int i = 0 ; i < 52 ; i++) { printf("%d\n", cards[i]); } 

Для полноты было указано, что тасование таким образом предвзято. Вот вариация, которая должна быть беспристрастной:

 cards[0] = 0; for(int i = 1 ; i < 52 ; i++) { int r = rand() % (i+1); cards[i] = cards[r]; cards[r] = i; } 

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

Выньте строку srand(time(NULL)); , Обычно вы должны делать это только один раз в своей программе, например, в начале main() , чтобы рандомизировать семя, используемое последующими вызовами rand() .

Если вы не хотите повторять случайные числа, решение состоит в том, чтобы отслеживать, какие случайные числа вы ранее использовали, и если вы получили «хит» в своем списке существующих номеров, повторите попытку.

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