Создайте два разных случайных числа в C

Я пытаюсь сгенерировать два разных случайных числа в C в заданном диапазоне. Диапазон

0 to nk-1

Но мой следующий код иногда работает, а иногда терпит неудачу. В чем причина этого?

n1=rand()%nk;
n2=rand()%nk;
while(n1==n2)
{
 srand(time(0));
 n2=rand()%nk;
} 

c
person Sumeet    schedule 20.09.2015    source источник
comment
srand() следует вызывать только один раз для заполнения генератора случайных чисел. Не вызывайте его внутри цикла while!   -  person francis    schedule 20.09.2015
comment
Канонический дубликат: srand(): зачем вызывать его только один раз?.   -  person Jonathan Leffler    schedule 20.09.2015
comment
Если вы хотите сгенерировать два разных случайных числа в этом диапазоне, вы должны использовать n1 = rand()%nk; n2 = ранд()%(nk-1); если(n1 == n2) n2 += 1; Вы должны избегать цикла while.   -  person Christian Fries    schedule 20.09.2015
comment
Я не вижу, что это дубликат (учитывая, что он заявляет в комментарии, что у него ошибка сегментации). Он должен пояснить, что означает отказ.   -  person Christian Fries    schedule 20.09.2015


Ответы (2)


srand(time(0));  

Это должно быть за пределами loop.

В цикле вы повторно заполняете RNG , тогда как вы должны делать это один раз.

person ameyCU    schedule 20.09.2015
comment
Я переместил его за пределы цикла, но это только увеличило вероятность успешного запуска. Это означает, что программа все еще ошибается, но меньше по сравнению с моим кодом. - person Sumeet; 20.09.2015
comment
@ Данте. Это ваш экскат-код? - person ameyCU; 20.09.2015
comment
Да, это мой точный код. - person Sumeet; 20.09.2015
comment
@Dante.: Segfault находится где-то еще в коде, который вы не показали. - person Blastfurnace; 20.09.2015

Вы должны засеять ГСЧ один раз,

srand(time(0));
n1=rand()%nk;
n2=rand()%nk;
while(n1==n2)
{
 n2=rand()%nk;
}
person Aldehir    schedule 20.09.2015
comment
Круто, теперь все работает. Не могли бы вы пролить свет на причину. Объяснение было бы здорово. - person Sumeet; 20.09.2015
comment
Взгляните на ответ на этот вопрос. - person Aldehir; 20.09.2015
comment
Извините, я запускал его только 4-5 раз. Но когда я запустил его в 12-й раз, все равно произошла ошибка сегментации. Я не думаю, что это правильно. - person Sumeet; 20.09.2015
comment
@ Данте. Ошибка сегментации происходит где-то еще. Я предлагаю вам запустить его через отладчик, чтобы определить причину. - person Aldehir; 20.09.2015