Как сгенерировать случайные числа без дубликатов, используя al oop в c ++? - PullRequest
0 голосов
/ 09 июля 2020

Пишу генератор случайных имен без дубликатов. Я хочу сделать это без других библиотек, таких как алгоритм , потому что я хочу понять, как это сделать. Есть ли способ сделать это с помощью al oop или вектора?

Я должен добавить имена, которые уже были в векторе, а затем проверить все элементы вектора с помощью while l oop но я не знал, как я могу это сделать.

    #include <windows.h>
    #include <conio.h>
    #include <vector>
    #include <ctime>
    #include <iostream>
    #include <ctime>
    
using namespace std;

int main() {
 srand((unsigned)time(0));   
    int names = 1;
    int a = 0;
    int x = 0;
    vector <string> vectornames;
    cout << "How many names would you like to add: ";
int amount_of_names;
cin >> amount_of_names;
    while (a < amount_of_names) {

 
cout << "Enter name " << names << ": ";
string name;
cin >> name;
vectornames.push_back(name);
names++;       
a++;   


    
   
       
    }
    while (x < amount_of_names) {
     cout << "\n" << vectornames.at(x);
    x++;   }
    
    cout << "\npress enter to continue: ";
    getch();
    system("cls");
    int z = 0;
while (z < amount_of_names) { 
     
     int random_number = (rand() % amount_of_names);
     if (vectornames.at(random_number) != vectornames.at(z)) {
    cout << "Hello ";
    cout << vectornames.at(z);
    cout << "! You will get " << vectornames.at(random_number) << "\n";
    vectornames.push_back(vectornames.at(random_number));
    
    
    getch();
     
    z++;
}}

    cout << "\n\n";
  

  return 0;
    }

1 Ответ

1 голос
/ 09 июля 2020

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

while (z < amount_of_names) {    <-- same amount as was entered in original loop
  int random_number = (rand() % amount_of_names);
  if (vectornames.at(random_number) != vectornames.at(z)) { <--- doesn't check for duplicates
    cout << "Hello ";
    cout << vectornames.at(z);
    cout << "! You will get " << vectornames.at(random_number) << "\n";
    vectornames.push_back(vectornames.at(random_number)); <---- adding to same vector
    getch();
    z++;
  }
}

Давайте посмотрим, что можно сделать без использования алгоритмов ... это означает, что нам нужно реализовать std::find или используйте другую структуру для проверки того, что уже выбрано.

!!! Предупреждение непроверенный код !!!

bool Find(const std::string& needle, const std::vector<std::string>& haystack) const {
  for(const auto& straw : haystack) {
    if (straw == needle) {
      return true;
    }
  }
  return false;
}

И обновленный код, который использует другой вектор для хранения использованных имена.

std::vector<std::string> used;

while (z < amount_of_names) {
  int random_number = (rand() % amount_of_names);
  
  if (!Find(vectornames.at(random_number), used)) { 
    cout << "Hello ";
    cout << vectornames.at(z);
    cout << "! You will get " << vectornames.at(random_number) << "\n";
    used.push_back(vectornames.at(random_number));
    getch();
    z++;
  }
}
...