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

时间:2016-06-28 05:18:11

标签: c++ c++11 random shuffle

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

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

1 个答案:

答案 0 :(得分:8)

规范中有关于洗牌的有趣陈述:

  

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

即便如此,该声明也无济于事。 “备注”部分是规范性文本,因此这表示g将提供随机数来确定混洗顺序。但是,它并未声明g是决定排列的唯一因素。

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

简而言之,不,std::shuffle并不保证您正在寻找的东西。