首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >澄清std::random_shuffle对载体的洗牌

澄清std::random_shuffle对载体的洗牌
EN

Stack Overflow用户
提问于 2021-05-26 06:32:59
回答 1查看 131关注 0票数 0

我是C++的乞丐,我想澄清一些事情。我有一个字符串向量,必须随机调整它。

我在试着弄清楚

代码语言:javascript
运行
复制
std::random_shuffle(vector.begin(), vector.end());
代码语言:javascript
运行
复制
int myrandom(int i) {
    return std::rand() % i;
}


std::random_shuffle(cards_vector.begin(), cards_vector.end(), myrandom);

只要我把下面的函数调用到我的主板上,两者似乎都能正常工作。

代码语言:javascript
运行
复制
srand(time(NULL)); 

我还在互联网上找到了另一个使用std::default_random_engine的解决方案。

代码语言:javascript
运行
复制
    auto rng = std::default_random_engine{};
    std::shuffle(cards_vector.begin(), cards_vector.end(), rng);

但是,上面的解决方案总是返回相同的洗牌,即使在主调用随机种子时也是如此。我不知道这是否有意这样做。

如果有人能向我澄清这件事,我很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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{}。此生成器默认使用默认种子初始化。

如果要为不同的应用程序运行生成不同的结果,则需要使用种子初始化生成器,这意味着每次应用程序启动时都会有所不同。

更正确的代码是:

代码语言:javascript
运行
复制
#include <algorithm>
#include <chrono>
#include <random>

// ...

auto rng = std::default_random_engine{std::chrono::system_clock::now().time_since_epoch().count()};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67699655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档