我是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);
只要我把下面的函数调用到我的主板上,两者似乎都能正常工作。
srand(time(NULL));
我还在互联网上找到了另一个使用std::default_random_engine的解决方案。
auto rng = std::default_random_engine{};
std::shuffle(cards_vector.begin(), cards_vector.end(), rng);
但是,上面的解决方案总是返回相同的洗牌,即使在主调用随机种子时也是如此。我不知道这是否有意这样做。
如果有人能向我澄清这件事,我很感激。
发布于 2021-05-26 07:23:09
函数随机播放有两个重载。简而言之,这意味着您可以使用不同数量的参数调用相同的函数。
std::random_shuffle(vector.begin(), vector.end());
调用由实现(编译器、操作系统、标准库、.)定义的内部随机生成器。但是,它通常是内部使用的std::rand
。从文件中:
随机数生成器是实现定义的,但是函数std::rand经常被使用。
std::random_shuffle(cards_vector.begin(), cards_vector.end(), myrandom);
使用一个显式随机生成器(您定义了它;即myrandom
),它在内部调用std::rand
。函数std:兰德 (来自C)生成一个-random数。这意味着,一旦您设置了种子,它将生成(每次)相同的数字序列。换句话说,序列是确定性的,取决于初始值(称为种子)。
为了设置std::rand
的种子(初始值),需要调用函数std::srand
,它接受种子作为参数。
语句srand(time(NULL));
是用“随机”(并不是实际的)种子初始化生成器的一种常见技巧。实际上,函数time(NULL)
返回的是每次调用时应该不同的当前时间。
因此,每次您的程序启动时,您都会用不同的数字设置种子,而生成器std::rand
每次都会产生不同的序列。
请注意,:std::random_shuffle
是一个旧的C++函数,已经被废弃了。您确实应该使用它的替代品,即std::shuffle
。
但是,上面的解决方案总是返回相同的洗牌,即使在主调用随机种子时也是如此。我不知道这是否有意这样做。
这背后的理由与上述相同。
在该示例中,您使用的是另一个伪随机数生成器(与std::rand
不同),即std::default_random_engine{}
。此生成器默认使用默认种子初始化。
如果要为不同的应用程序运行生成不同的结果,则需要使用种子初始化生成器,这意味着每次应用程序启动时都会有所不同。
更正确的代码是:
#include <algorithm>
#include <chrono>
#include <random>
// ...
auto rng = std::default_random_engine{std::chrono::system_clock::now().time_since_epoch().count()};
https://stackoverflow.com/questions/67699655
复制相似问题