#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
int main() {
std::vector<short> a(256);
for (short x = 0; x != 256; ++x) {
a[x] = x;
}
for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl;
std::cout << std::endl;
std::srand(11);
std::random_shuffle(a.begin(), a.end());
for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl;
std::cout << std::endl;
for (short x = 0; x != 256; ++x) {
a[x] = x;
}
for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl;
std::cout << std::endl;
std::srand(11);
std::random_shuffle(a.begin(), a.end());
for (auto x : a) { std::cout << x << ' '; } std::cout << std::endl;
}
所以,这是我的代码。我所期待的显然是两次同样的洗牌。我得到的是,虽然洗牌在发布之间是一致的,但它们是不同的,似乎忽略了srand!我在这里做错了什么?
答案 0 :(得分:2)
首先请注意,您使用的std::random_shuffle
版本已被弃用。
另请注意(来自之前的参考链接)
...经常使用函数
std::rand
。
此处的关键字通常是 ,而总是。
如果要确保始终创建相同的序列,那么您应该使用其中一个备选方案,传递特定的随机数函数,或使用std::shuffle
函数传递生成器(来自C ++ 11“new”PRNG classes)。
答案 1 :(得分:2)
请注意,对于std::random_shuffle
,使用的是随机数生成器是实现定义的,它不能保证使用std::rand
。
您可以使用std::shuffle
代替并传递一个随机数生成器:
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(a.begin(), a.end(), g);