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

时间:2016-10-04 21:03:11

标签: c++ c++11

以下随机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

2 个答案:

答案 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)返回一个不同的值,你应该得到一个不同的随机随机元素。

如果您运行的代码与我的代码不同,您可能会得到不同的结果,但我们无法解释结果,因为您没有向我们展示您的代码。