文字列のベクトルが 2 つあります (一方は他方のサイズの約 1/3 です)。2 つのベクトルをランダムにシャッフルするアルゴリズムを実装しようとしています。結果として得られるベクトル項目では、以前にベクトル A にあったものは互いに追跡できますが、ベクトル B にあったものは追跡できません。
たとえば、ベクトル A のすべての要素が「FOO」で、ベクトル B のすべての要素が「BAR」の場合、結果のベクトルは {"FOO","FOO","BAR","FOO","BAR", "フー","フー","バー"}
ご覧のとおり、「FOO」は繰り返すことができますが、「BAR」は繰り返してはなりません
これはおおよそ私がこれまでに持っているものです:
#include <string>
#include <chrono>
#include <algorithm>
#include <random>
#include <vector>
std::vector<std::string> a(1000, "FOO");
std::vector<std::string> b(300, "BAR");
std::vector<std::string> result;
bool resultIsValid();
void mergeVectors()
{
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937 generator(seed);
result = a;
result.insert(result.end(), b.begin(), b.end());
while (!resultIsValid())
{
std::shuffle(a.begin(), a.end(), generator);
}
}
bool resultIsValid()
{
for(int i=0; i<result.size()-2; ++i)
if (result[i] == "BAR" && result[i+1] == "BAR")
return false;
return true;
}
これは実際のコードではありませんが、これでアイデアが得られるはずです。これを実行すると、文字列の実際の数がはるかに多く (10000 の範囲)、有効なベクトルを取得できないため、プログラムは無限ループに入ります。順番に繰り返される "BAR" の少なくとも 1 つが常に存在します。「BAR」の重複について作成されたベクトルを再チェックし続けるよりも、より良い代替案を誰かが提案できますか? これを必要以上に複雑にしていますか?