gpt4 book ai didi

C++ random_shuffle 总是给出相同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:57 28 4
gpt4 key购买 nike

以下对随机洗牌的调用始终为 vector v 提供相同的结果

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>

using namespace std;

int main(){
vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
srand(time(0));
random_shuffle(v.begin(), v.end());
for (int i = 0; i < v.size(); ++i) printf("%d ", v[i]); printf("\n");
printf("%d\n", rand() % 100);

return 0;
}

我试过用

编译
g++ -std=c++0x
g++ -std=c++11

但是每次都给出相同的结果,所以我真的不明白发生了什么。

$./a.out
7 1 4 6 8 9 5 2 3 10
26
$ ./a.out
7 1 4 6 8 9 5 2 3 10
41
$ ./a.out
7 1 4 6 8 9 5 2 3 10
39

最佳答案

OP's comment明确表示他们使用的是 Clang 和 libc++,而不是 GCC/libstdc++。

快速浏览 libc++ 的 random_shuffle implementation显示它使用类型为 __rs_default 的对象作为其随机源,并检查 the implementation of __rs_default 表明它只是使用默认构造的 std::mt19937对象:

__rs_default::result_type
__rs_default::operator()()
{
static mt19937 __rs_g;
return __rs_g();
}

换句话说,在这个实现中srandrandom_shuffle 的双参数版本使用的“随机性”来源没有任何影响. (可怕的引用,因为它总是使用固定的种子。)注意 random_shuffle不需要使用 rand根本没有,所以你不能指望srand无论如何都可以在可移植代码中“工作”。

使用 std::shuffle<random>设施代替。

关于C++ random_shuffle 总是给出相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39861699/

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