【发布时间】:2021-08-14 09:17:28
【问题描述】:
我是 C++ 的初学者,想澄清一些事情。我有一个字符串向量,必须随机打乱它。
我正在尝试了解两者之间的区别
std::random_shuffle(vector.begin(), vector.end());
int myrandom(int i) {
return std::rand() % i;
}
std::random_shuffle(cards_vector.begin(), cards_vector.end(), myrandom);
只要我在 main.c 开头调用以下函数,两者似乎都可以正常工作
srand(time(NULL));
我还在互联网上找到了另一个使用 std::default_random_engine 的解决方案
auto rng = std::default_random_engine{};
std::shuffle(cards_vector.begin(), cards_vector.end(), rng);
但是,即使在 main 中调用了随机种子,上述解决方案也总是返回相同的 shuffle。我不确定这是不是有意的。
如果有人可以向我澄清这一点,我将不胜感激。
【问题讨论】:
-
请注意,
std::random_shuffle已在 C++17 标准中被删除,取而代之的是std::shuffle。 -
srand与 C++ 随机功能无关。您需要为随机引擎播种。此处示例:en.cppreference.com/w/cpp/numeric/random -
另请注意,
std::srand用于旧的 C 函数rand。 -
std::shuffle()和std::srand()不相关。要播种std::default_random_engine,使用了不同的机制(通常是std::random_device)。 -
std::default_random_engine{std::random_device{}()}