Бесконечный L oop, где, если операторы не вызываются - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь написать кусок кода, который проходит через случайный элемент массива строк и затем выводит его. После вывода он устанавливает этот элемент в 0. И затем оператор if гарантирует, что имя больше не будет выводиться.

void group(){  
  int random =  rand() % 50;
  int i, j = 0;
  while(j<50){ 
    srand(0);
    random =  rand() % 50; 
    groupNum = 1;
    cout << "Group " << groupNum << " has: ";
    if(names[random] != "0"){ 
      cout << names[random] << " "; 
    names[random] = "0"; 
    j++;
    }  
    if(names[random] == "0"){ 
      continue;
    }
    i++; 
    if(i == peoplePerGroup){ 
      groupNum++; 
      cout << "\n\n"; 
      i=0;
      }
    } 
  }  

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

В качестве небольшого объяснения, почему повторное заполнение с тем же номером вызывает эту проблему: rand () использует псевдослучайность, и поэтому оно воспроизводимо. По сути, он содержит некоторый внутренний номер, который устанавливается на основе начального числа. Например, число имеет битовое XOR (^), примененное к константе et c. После каждого звонка номер также увеличивается внутри. Естественно, это означает, что с одним и тем же начальным номером (он же семя) вы каждый раз получаете одни и те же результаты.

Кстати, весь ваш код становится намного более плавным, если вы заполняете все свои слова в std :: set и удалите слово из набора, когда берете его, вместо того, чтобы установить его в нуль. Смотрите здесь: Как выбрать случайный элемент в std :: set?

Или, что еще проще, заполните их в вектор и примените: std :: random_shuffle Затем просто выполните итерацию по этому вектору a однократное получение слов в случайном порядке.

0 голосов
/ 06 февраля 2020

Функция srand (как генератор псевдослучайных чисел) должна быть сеяна только один раз, перед любыми вызовами rand () и запуском программы. Он не должен быть повторно посеян или повторен каждый раз, когда вы будете генерировать новую партию псевдослучайных чисел.

"Для генерации случайных чисел srand обычно инициализируется каким-то отличительным значение времени выполнения, например, значение, возвращаемое функцией time (объявлено в заголовке). Это достаточно характерно для большинства тривиальных задач рандомизации. "

Кроме того, каждый раз, когда ваша функция запускается, она получает случайный элемент вашего массива и устанавливает его на ноль. Единственный способ, которым это l oop заканчивается, - это сценарий, в котором все элементы этого массива были установлены на ноль. Покупайте в каждом l oop, выбранный индекс является случайным. Подумайте, сколько раз им нужно бежать, пока они не удовлетворят вашим требованиям.

...