Как из массива данных типа 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть таблица, я получаю массив в котором названия например "администрация"Они в таблице находятся в td с классом hide-tr
Что-то похожее на, то что мне нужно здесьТолько мне хотелось бы это в виде LINQ и с возможностью агрегации не в строку, а в список
Нужно установить в emacs поддержку c#, я пробовал курить мануалы на гитхабе, пытался ставить и csharp mode и omnisharpКонкретно не работает шаг M-x package-install...
У меня есть новый проект, создавал по гайду1: решение и в нём два проекта: MathUtilities и MathUtilitiesTests; всё через консоль, установлен