Случайные индексы в облаке точек

Я пытаюсь найти случайные индексы для выбора некоторых точек в облаке точек. Ниже приведен код. Однако даже после использования srand() я получаю одно и то же число все три раза. Может ли кто-нибудь помочь, по этому поводу?

/* find three points randomly */ 
for (long i = 0; i < 3; ++i) 
{
   srand (time(NULL));
   cout <<"\nRandom index" << (rand() % points.size() + 1); 
}

person M.B.    schedule 15.02.2017    source источник
comment
внимательно прочитайте srand(), и вы поймете, что не так с вашим кодом.   -  person Redanium    schedule 15.02.2017
comment
Да... $srand()$ нужно вызывать один раз... вне цикла... спасибо :)   -  person M.B.    schedule 15.02.2017
comment
Есть некоторые предостережения относительно rand(), о которых вам следует знать. Самое главное, диапазон rand() часто очень ограничен и может составлять всего [0, 32767], что означает, что вы когда-либо выберете только 3 точки из первых 32767 точек, а облака точек, как правило, намного больше, чем это . В C++11 доступны лучшие генераторы случайных чисел, см.: en.cppreference.com /w/cpp/numeric/random Еще одно предостережение заключается в том, что вы не предотвращаете двойной выбор одного и того же числа, что может быть проблемой, а может и не быть. Вы можете создать уникальные индексы следующим образом: stackoverflow.com/a/9651058/913630   -  person Markus    schedule 16.02.2017
comment
Спасибо @Markus за скрытые детали :)   -  person M.B.    schedule 16.02.2017


Ответы (1)


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

Вместо этого заполните его один раз в начале:

/* find three points randomly */ 
srand(time(NULL));
for(int i = 0; i != 3; ++i) {
  cout <<"\nRandom index" << (rand() % points.size() + 1); 
}

Вам также не нужно использовать long для цикла из трех шагов :)

person Riot    schedule 16.02.2017