为什么srand(time(NULL))即使重复重置也能顺利运行?

时间:2017-04-09 00:25:52

标签: c++ random srand

我有一个函数可以创建一个大小为N的向量,并将其混洗:

void rand_vector_generator(int N) {
   srand(time(NULL));
   vector <int> perm(N);
   for (unsigned k=0; k<N; k++) {
      perm[k] = k;
   }
   random_shuffle(perm.begin(),perm.end());
}

我用循环中的主函数调用它:

for(int i=0; i<20; i++)
    rand_vector_generator(10);

我希望这不会给我足够的随机性,因为我在每个函数调用时调用srand(time(NULL));,并且种子与连续的调用调用没有太大区别。我的理解是我拨打srand(time(NULL));一次而不是多次,因此种子不会“重置”。

thread有点肯定了我期待的结果。

相反,我得到:

6 0 3 5 7 8 4 1 2 9 
0 8 6 4 2 3 7 9 1 5 
8 2 4 9 5 0 6 7 1 3 
0 6 1 8 7 4 5 2 3 9 
2 5 1 0 3 7 6 4 8 9 
4 5 3 0 1 7 2 9 6 8 
8 5 2 9 7 0 6 3 4 1 
8 4 9 3 1 5 7 0 6 2 
3 7 6 0 9 8 2 4 1 5 
8 5 2 3 7 4 6 9 1 0 
5 4 0 1 2 6 8 7 3 9 
2 5 7 9 6 0 4 3 1 8 
5 8 3 7 0 2 1 6 9 4 
7 4 9 5 1 8 2 3 0 6 
1 9 2 3 8 6 0 7 5 4 
0 6 4 3 1 2 9 7 8 5 
9 3 8 4 7 5 1 6 0 2 
1 9 6 5 3 0 2 4 8 7 
7 5 1 8 9 3 4 0 2 6 
2 9 6 5 4 0 3 7 8 1 

这些向量似乎随机地拖着我。我错过了什么? srand调用是否以某种方式存在于与函数调用不同的范围内,因此每次调用都不会重置?或者我在这里误解了一些更基本的东西?

1 个答案:

答案 0 :(得分:3)

根据标准,std::randstd::random_shufflestd::shuffle的使用是实现定义的(尽管通常情况是{{1}使用这是不保证)。在另一个编译器上试试吗?另一个平台?

如果您想确定使用std::rand,您应该让代码明确使用它(例如,使用 lambda 表达式):

std::rand

在某种程度上不相关的说明中,random_shuffle(perm.begin(), perm.end(), []{return std::rand();}); 的精度是整整一秒,你的代码运行速度比我想要的快(我希望)所以这些多次调用time()导致重置为同一种子