以下随机shuffle调用始终为vector v
提供相同的结果name_id
我尝试使用
进行编译#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
答案 0 :(得分:5)
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();
}
换句话说,在这个实现中,srand
对&#34;随机性&#34;的来源没有任何影响。由random_shuffle
的双参数版本使用。 (可怕的引用,因为它总是使用固定的种子。)请注意,random_shuffle
根本不需要使用rand
,因此您不能期望srand
到#34}。工作&#34;无论如何,在便携式代码中。
改为使用std::shuffle
和<random>
设施。
答案 1 :(得分:3)
首先,-std=c++0x
和-std=c++11
意味着完全相同,所以测试两者都是毫无意义的。
你没有提供完整的程序(请在下次阅读https://stackoverflow.com/help/mcve),所以我猜到了你的其余代码,我试过这个:
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdlib.h>
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 : v)
std::cout << i << ' ';
std::cout << std::endl;
}
我每秒都得到不同的结果:
tmp$ ./a.out
2 1 8 5 9 7 6 3 10 4
tmp$ ./a.out
10 7 6 3 1 8 9 4 5 2
tmp$ ./a.out
4 7 3 6 5 8 1 9 10 2
tmp$ ./a.out
4 7 3 6 5 8 1 9 10 2
tmp$ ./a.out
4 7 3 6 5 8 1 9 10 2
tmp$ ./a.out
10 2 6 3 9 4 5 7 8 1
tmp$ ./a.out
10 2 6 3 9 4 5 7 8 1
tmp$ ./a.out
10 2 6 3 9 4 5 7 8 1
tmp$ ./a.out
2 1 3 7 5 8 9 6 4 10
产生相同结果的时间是因为time(0)
返回的秒数相同,因此rand()
函数的种子是相同的,因此结果是相同。如果你等待一秒,以便time(0)
返回一个不同的值,你应该得到一个不同的随机随机元素。
如果您运行的代码与我的代码不同,您可能会得到不同的结果,但我们无法解释结果,因为您没有向我们展示您的代码。