我有 2 个字符串向量(一个大约是另一个的 1/3)。我正在尝试实现一种算法,将两个向量随机混洗在一起。在结果向量中,先前在向量 A 中的项目可以相互跟随,但在向量 B 中的项目不能。
例如,如果向量 A 中的每个元素都是“FOO”,向量 B 中的每个元素都是“BAR”,那么结果向量可能是 {"FOO","FOO","BAR","FOO","BAR", "FOO","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”按顺序重复。任何人都可以提出更好的替代方案,然后继续重新检查创建的向量中是否存在“BAR”的重复项?我是否让这变得比它必须的更复杂?