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

Does `std::shuffle` guarantees same order with same seed on different vectors?

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

// 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 规范的保证吗?

规范中关于shuffle的说法很有意思:

Remarks: To the extent that the implementation of this function makes use of random numbers, the object g shall serve as the implementation’s source of randomness.

即便如此,该声明对您没有帮助。 "Remarks" 部分是规范文本,所以这就是说 g 将提供随机数来确定打乱的顺序。但是,它并没有声明 g 是决定排列的唯一因素。

虽然容器值的大小可能无关紧要,但无法保证某些 属性 类型不会影响某些内容。例如,如果值类型是可简单复制的,则实现可能会使用使用稍微不同算法的不同版本的函数。但是,如果它是寄存器大小的值,则可能不会。

简而言之,不,std::shuffle 不能保证您要查找的内容。