Я знаю, что на это уже есть много ответов, но мне пришла в голову мысль. Вы можете иметь 7 массивов, один из которых содержит все 6 цифр, и по одному для каждого, в котором отсутствует данная цифра. Как это:
int v[7][6] = {
{1, 2, 3, 4, 5, 6 },
{2, 3, 4, 5, 6, 0 }, // zeros in here to make the code simpler,
{1, 3, 4, 5, 6, 0 }, // they are never used
{1, 2, 4, 5, 6, 0 },
{1, 2, 3, 5, 6, 0 },
{1, 2, 3, 4, 6, 0 },
{1, 2, 3, 4, 5, 0 }
};
Тогда вы можете иметь 2 уровня истории. Наконец, чтобы сгенерировать число, если ваша история совпадений меньше максимальной, перемешайте v [0] и возьмите v [0] [0]. В противном случае перемешайте первые 5 значений из v [n] и возьмите v [n] [0]. Примерно так:
#include <algorithm>
int generate() {
static int prev = -1;
static int repeat_count = 1;
static int v[7][6] = {
{1, 2, 3, 4, 5, 6 },
{2, 3, 4, 5, 6, 0 }, // zeros in here to make the code simpler,
{1, 3, 4, 5, 6, 0 }, // they are never used
{1, 2, 4, 5, 6, 0 },
{1, 2, 3, 5, 6, 0 },
{1, 2, 3, 4, 6, 0 },
{1, 2, 3, 4, 5, 0 }
};
int r;
if(repeat_count < 2) {
std::random_shuffle(v[0], v[0] + 6);
r = v[0][0];
} else {
std::random_shuffle(v[prev], v[prev] + 5);
r = v[prev][0];
}
if(r == prev) {
++repeat_count;
} else {
repeat_count = 1;
}
prev = r;
return r;
}
Это должно привести к хорошей случайности (не зависящей от rand() % N
), отсутствию бесконечных циклов и должно быть достаточно эффективным, учитывая небольшое количество чисел, которые мы перетасовываем каждый раз.
Обратите внимание, что из-за использования статики не является поточно-безопасным , что может подойти вам, если это не так, тогда вы, вероятно, захотите обернуть это в объект, каждый со своим собственным состоянием.