Как из массива данных типа char вывести случайные пары элементов, чтобы те не повторялись? Уже сделал работающую программу для вывода этих рандомных пар, но они повторяются. Буду очень благодарен за помощь!
setlocale(LC_ALL, "Rus");
const char* a1[6] = { "ABC","ACB","BCA","BAC","CAB","CBA" };
srand(time(nullptr));
int c = 6;
for (int i = 1; i < 7; i++)
{
cout << a1[rand() % c] << " - " << a1[rand() % c] << endl;
}
return 0;
#include <iostream>
#include <random>
using namespace std;
int main()
{
const char* a1[6] = {"ABC", "ACB", "BCA", "BAC", "CAB", "CBA"}; // слова
int c = 6, j = 0, r, s, f;
int num[60]; // рабочий массив для хранения индексов напечатанных слов
for (int i = 0; i < 60; i++) num[i] = 0;
setlocale(LC_ALL, "Rus");
random_device rd; // генератор сл.чисел
mt19937 gen(rd());
uniform_int_distribution<> dist(0,5); // сл.числа в нормированном диапазоне от 0 до 5
while (j < 60) {
r = dist(gen);
do {
s = dist(gen);
} while(s == r); // слова в паре не должны повторяться
f = 1; // флажок уникальной пары слов
if(j > 0) // если это не первая пара, ищем ее среди напечатанных
for (int k = 0; k < j; k += 2)
if(r == num[k] && s == num[k+1]) { // если новая пара слов найдена среди напечатанных
f = 0; // сбросить флаг уникальной пары
break;
}
if(f == 1) { // если новая пара слов уникальна, сохраним индексы слов в массиве и печатаем
num[j] = r;
num[j+1] = s;
cout << a1[r] << " - " << a1[s] << " " << (j+2)/2 << endl;
j += 2;
}
}
cout << "Число размещений из 6 по 2 = " << j/2 << endl; // 6!/(6-2)! = 30
return 0;
}
Замечание: Для корректной компиляции в Code::Blocks необходима включенная опция
-std=c++11. Это вызвано использованием продвинутого генератора случайных чисел.
Предлагаю Вам решить задачу таким путем
next_permutation создаст вам набор перечислений без повторений.
Дальше мешайте контейнер и выводи сколько надо уникальных комбинаций
#include <iostream>
#include <vector>
#include <string>
#include <numeric>
#include <algorithm>
#include <random>
int main() {
std::vector<char> char_array{'a', 'b', 'c'};
std::vector<std::string> comb;
do {
comb.push_back(std::accumulate(std::begin(char_array), std::end(char_array), std::string{""}));
} while (std::next_permutation(std::begin(char_array), std::end(char_array)));
std::size_t count_print{2};
if (count_print > comb.size()) {
throw std::out_of_range ("...");
}
std::shuffle(std::begin(comb), std::end(comb), std::mt19937_64{std::random_device{}()});
auto n{count_print};
auto it{std::begin(comb)};
while (n) {
std::cout << *it << std::endl;
it = std::next(it);
--n;
}
return 0;
}
Просто, но если требуется неповторений в паре, а не вообще:
for (int i = 1; i < 5; i++)
{
size_t j1 = rand() % c,
j2 = j1;
while (j2 == j1)
j2 = rand() % c;
cout << a1[j1] << " - " << a1[j2] << endl;
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости