`std :: shuffle`是否在不同的向量上使用相同的种子保证相同的顺序?

lve*_*lla 7 c++ random shuffle c++11

我有两个具有相同数量元素的向量,但它们的类型具有完全不同的大小.我需要对它们进行混洗,以便在混洗后两者具有完全相同的顺序(一个向量中的每个元素与另一个向量中的每个元素相关).我发现这样做的方式是:

// 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);
}
Run Code Online (Sandbox Code Playgroud)

我可以放心,两个载体都会以同样的方式洗牌吗?这个实现依赖吗?我是否有std::shuffle规格保证?

Nic*_*las 8

在规范中有一个关于shuffle的有趣声明:

备注:如果此函数的实现使用随机数,则该对象g应作为实现的随机源.

即便如此,该声明对您没有帮助."备注"部分是规范性文本,因此这g将说明将提供随机数来确定混洗顺序.但是,它没有声明这g是决定排列的唯一因素.

虽然容器的大小值可能无关紧要,但不能保证该类型的某些属性不会影响某些东西.例如,如果值类型可以轻易地复制,则实现可能使用使用稍微不同算法的函数的不同版本.但是,如果它是一个寄存器大小的值,它可能不是.

简而言之,不,std::shuffle不保证你在寻找什么.