std::random_shuffle 未播种
std::random_shuffle not being seeded
#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!我在这里做错了什么?
首先请注意,您使用的 std::random_shuffle
版本已被弃用。
另请注意(来自之前的参考资料link)
...the function std::rand
is often used.
这里的关键词是经常而不是总是。
如果你想确保始终创建相同的序列,那么你应该使用其中一种方法,传递一个特定的随机数函数,或者使用 std::shuffle
函数传递一个生成器(来自C++11 "new" PRNG classes).
请注意,std::random_shuffle
使用的随机数生成器是实现定义的,不能保证使用 std::rand
。
您可以改用 std::shuffle
并将其传递给随机数生成器:
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(a.begin(), a.end(), g);
#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!我在这里做错了什么?
首先请注意,您使用的 std::random_shuffle
版本已被弃用。
另请注意(来自之前的参考资料link)
...the function
std::rand
is often used.
这里的关键词是经常而不是总是。
如果你想确保始终创建相同的序列,那么你应该使用其中一种方法,传递一个特定的随机数函数,或者使用 std::shuffle
函数传递一个生成器(来自C++11 "new" PRNG classes).
请注意,std::random_shuffle
使用的随机数生成器是实现定义的,不能保证使用 std::rand
。
您可以改用 std::shuffle
并将其传递给随机数生成器:
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(a.begin(), a.end(), g);