Q:

использование random в массивах С++

Как из массива данных типа 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;

A:

#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. Это вызвано использованием продвинутого генератора случайных чисел.

