为什么 srand(time(NULL)) 即使我反复重置它也能顺利工作?
Why is srand(time(NULL)) working smoothly even though I repeatedly reset it?
我有一个函数可以创建一个大小为 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));
一次而不是多次,所以种子不会 "reset"。
这个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
调用是否以某种方式存在于与函数调用不同的范围内,因此它不会在每次调用时都被重置?还是我误解了更基本的东西?
根据标准,std::rand
在 std::random_shuffle
和 std::shuffle
中的使用是 实现定义的 (尽管通常是这种情况使用 std::rand
这是 不能保证的 )。在另一个编译器上试试?另一个平台?
如果你想让确定使用std::rand
你应该让你的代码明确地使用它(例如,使用lambda表达式):
random_shuffle(perm.begin(), perm.end(), []{return std::rand();});
有点不相关的说明,time()
的精度是 整整一秒 ,您的代码运行速度比那快得多(我希望如此)所以那些倍数调用 srand()
导致重置为相同的 seed
我有一个函数可以创建一个大小为 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));
一次而不是多次,所以种子不会 "reset"。
这个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
调用是否以某种方式存在于与函数调用不同的范围内,因此它不会在每次调用时都被重置?还是我误解了更基本的东西?
根据标准,std::rand
在 std::random_shuffle
和 std::shuffle
中的使用是 实现定义的 (尽管通常是这种情况使用 std::rand
这是 不能保证的 )。在另一个编译器上试试?另一个平台?
如果你想让确定使用std::rand
你应该让你的代码明确地使用它(例如,使用lambda表达式):
random_shuffle(perm.begin(), perm.end(), []{return std::rand();});
有点不相关的说明,time()
的精度是 整整一秒 ,您的代码运行速度比那快得多(我希望如此)所以那些倍数调用 srand()
导致重置为相同的 seed