c++ - `std::shuffle` 是否保证不同 vector 上相同种子的相同顺序?

标签 c++ c++11 random shuffle

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

// 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);
}

我可以放心两个 vector 将以相同的方式打乱吗?这个实现依赖吗? 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.

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

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

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

关于c++ - `std::shuffle` 是否保证不同 vector 上相同种子的相同顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38067584/

相关文章:

c++ - Visual Studio 2010 单元测试

c++ - 我们需要为 gcnew 创建指针验证吗

c++ - 不同指针类型之间的无效比较 : 'type*' and 'type&(*)()'

C# 随机 - if 语句仅输出 = -1

c - 带有种子的随机数生成器

iphone - 在 cocos2d 中使用 NSTimer 制作随机对象

c++ - 调用重载赋值运算符后的析构函数调用 - C++

c++ - 指针操作++导致内存泄漏?

c++ - 我的 g++ 使用 vector<weak_ptr> erase() 方法生成奇怪的警告

c++ - 静态模板成员函数的实例化?