c++ - 为什么 srand(time(NULL)) 即使我反复重置它也能顺利工作?

标签 c++ random srand

我有一个函数可以创建一个大小为 N 的 vector ,并将其打乱:

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 

这些 vector 对我来说似乎是随机打乱的。我错过了什么? srand 调用是否以某种方式存在于与函数调用不同的范围内,因此它不会在每次调用时都被重置?还是我在这里误解了更基本的东西?

最佳答案

根据标准,在 std::random_shufflestd::shuffle 中使用 std::rand实现-defined(尽管通常情况下会使用 std::rand,但不能保证)。在另一个编译器上试试?另一个平台?

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

random_shuffle(perm.begin(), perm.end(), []{return std::rand();});

稍微不相关的一点是,time() 的精度是一整秒,您的代码运行速度比这快得多(我希望如此),所以那些倍数调用 srand() 会导致重置为相同的 seed

关于c++ - 为什么 srand(time(NULL)) 即使我反复重置它也能顺利工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43301770/

相关文章:

c - srand()——为什么只调用一次?

C++ 类型转换替代虚拟方法

C++ 访问 vector 的 vector 出现段错误

c++ - 编程错误,C++ 新手

algorithm - 使用 Box-Muller 变换生成具有任意 sigma 和均值的伪随机数

c++ - std::uniform_real_distribution - 获取所有可能的数字

algorithm - 如何获得真正的随机数?

random - 什么是Swift3(Xcode8 beta 1)中的随机种子等效项

c++ - std::random_shuffle 产生相同的结果,即使 srand(time(0)) 被调用一次

c++ - 在cpp函数中初始化多个结构