gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:12 25 4
gpt4 key购买 nike

我有两个元素数量相同的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com