我有两个具有相同数量元素的向量,但它们的类型具有完全不同的大小。我需要对它们进行混洗,以便在混洗后两者具有完全相同的顺序(一个向量中的每个元素与另一个向量中的每个元素相关)。我发现这样做的方式是:
// sizeof(a[0]) != sizeof(b[0])
// a.size() == b.size()
{
std::mt19937 g(same_seed);
std::shuffle(a.begin(), a.end(), g);
}
{
std::mt19937 g(same_seed);
std::shuffle(b.begin(), b.end(), g);
}
我可以放心,两个载体都会以同样的方式洗牌吗?这个实现依赖吗?我是否有std::shuffle
规范的保证?
答案 0 :(得分:8)
规范中有关于洗牌的有趣陈述:
备注:如果此函数的实现使用随机数,则对象
g
将作为实现的随机源。
即便如此,该声明也无济于事。 “备注”部分是规范性文本,因此这表示g
将提供随机数来确定混洗顺序。但是,它并未声明g
是决定排列的唯一因素。
虽然容器的大小值可能无关紧要,但是没有保证该类型的某些属性不会影响某些东西。例如,如果值类型可以轻易地复制,则实现可能使用使用稍微不同算法的函数的不同版本。但是,如果它是一个寄存器大小的值,它可能不会。
简而言之,不,std::shuffle
并不保证您正在寻找的东西。