C++11:如何使用 设置种子

2024-04-19

我正在练习随机库,这是 C++11 的新功能。我编写了以下最小程序:

#include <iostream>
#include <random>
using namespace std;
int main() {
    default_random_engine eng;
    uniform_real_distribution<double> urd(0, 1);
    cout << "Uniform [0, 1): " << urd(eng);
}

当我重复运行它时,它每次都会给出相同的输出:

>a
Uniform [0, 1): 0.131538
>a
Uniform [0, 1): 0.131538
>a
Uniform [0, 1): 0.131538

我想让程序在每次调用时设置不同的种子,以便每次生成不同的随机数。我知道 random 提供了一个名为 Seed_seq 的工具,但我发现它的解释(在 cplusplus.com)完全晦涩难懂:

http://www.cplusplus.com/reference/random/seed_seq/ http://www.cplusplus.com/reference/random/seed_seq/

我希望得到有关如何让程序在每次调用时生成新种子的建议:越简单越好。

我的平台:

  • Windows 7的 :TDM-GCC编译器 http://tdm-gcc.tdragon.net/

拥有一个seed_seq就是增加生成序列的熵。如果您的系统上有一个 random_device,则使用该随机设备中的多个数字进行初始化可以说可以做到这一点。在具有伪随机数生成器的系统上,我认为随机性(即生成的序列熵)不会增加。

在此基础上你的方法:

如果您的系统确实提供了随机设备,那么您可以像这样使用它:

  std::random_device r;
  // std::seed_seq ssq{r()};
  // and then passing it to the engine does the same
  default_random_engine eng{r()};
  uniform_real_distribution<double> urd(0, 1);
  cout << "Uniform [0, 1): " << urd(eng);

如果您的系统没有随机设备,那么您可以使用time(0)作为 random_engine 的种子

  default_random_engine eng{static_cast<long unsigned int>(time(0))};
  uniform_real_distribution<double> urd(0, 1);
  cout << "Uniform [0, 1): " << urd(eng);

如果你有多个随机源,你实际上可以这样做(例如 2)

std::seed_seq seed{ r1(), r2() };
  default_random_engine eng{seed};
  uniform_real_distribution<double> urd(0, 1);
  cout << "Uniform [0, 1): " << urd(eng);

其中 r1 , r2 是不同的随机设备,例如A热噪声 or 量子源 .

当然你可以混合搭配

std::seed_seq seed{ r1(), static_cast<long unsigned int>(time(0)) };
  default_random_engine eng{seed};
  uniform_real_distribution<double> urd(0, 1);
  cout << "Uniform [0, 1): " << urd(eng);

最后,我喜欢用一个衬垫进行初始化:

  auto rand = std::bind(std::uniform_real_distribution<double>{0,1},
              std::default_random_engine{std::random_device()()});
  std::cout << "Uniform [0,1): " << rand();

如果您担心time(0)具有第二精度,您可以通过使用来克服这个问题high_resolution_clock要么通过请求自纪元以来的时间(首先由指定)下面 bames23 https://stackoverflow.com/a/34490647/4345926:

static_cast<long unsigned int>(std::chrono::high_resolution_clock::now().time_since_epoch().count()) 

或者也许只是玩弄 CPU 随机性

long unsigned int getseed(int const K)
{

    typedef std::chrono::high_resolution_clock hiclock;

    auto gett= [](std::chrono::time_point<hiclock> t0)
    {
        auto tn = hiclock::now();
        return static_cast<long unsigned int>(std::chrono::duration_cast<std::chrono::microseconds>(tn-t0).count());
    };

    long unsigned int diffs[10];
    diffs[0] = gett(hiclock::now());
    for(int i=1; i!=10; i++)
    {
        auto last = hiclock::now();
        for(int k=K; k!=0; k--)
        {
            diffs[i]= gett(last);
        }
    }

    return *std::max_element(&diffs[1],&diffs[9]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11:如何使用 设置种子 的相关文章

随机推荐

  • 获取两个字典列表之间的差异(增量)

    我有以下 Python 数据结构 data1 name u String 1 name u String 2 data2 name u String 1 name u String 2 name u String 3 我正在寻找获得两个列表
  • DataGridTemplateColumn 中的 ComboBox 不显示 SelectedItem

    我想制作其中包含 ComboBox 的自定义 DataGrid 列 组合框的 ItemSource 绑定到枚举 组合框的 selecteditem 绑定到集合元素中选定的枚举值 这是代码
  • 保持java套接字打开?

    我正在制作一个会自动更新的程序 游戏 我有更新部分 但没有检查版本 我本以为这会很容易 这就是我所做的 我为游戏编写了一个更新程序 并且编写了一个服务器 每次客户端 更新程序连接时 服务器都会启动一个线程 线程处理一切 游戏更新程序读取一个
  • Symfony 2 功能测试外部 URL

    无论我做什么 我总能得到一个 Symfony Component HttpKernel Exception NotFoundHttpException 否 已找到 的路线 in crawler gt text 当我尝试使用以下命令请求外部
  • 如何向 img 标签添加到期日期?

    我正在使用 Page Speed Firebug 扩展来帮助提高页面性能 我有一个包含大量图像的页面 它提出的建议之一是 利用浏览器缓存 以下可缓存资源的新鲜生命周期较短 指定以下资源至少在未来一周后到期 http www mysite c
  • 使用Jquery打印div内容

    我想使用 jQuery 打印 div 的内容 这个问题已经在 SO 中提出 但我找不到正确的 有效的 答案 这是我的 HTML div p This is a sample text for printing purpose p div
  • PostgreSQL 恢复后,我收到“关系 django_session 的权限被拒绝”

    我目前正在实时服务器和本地运行我的 Django 1 1 1 站点和 PostgreSQL 8 4 2 当我尝试从本地机器上的实时服务器恢复我的备份之一时 在本地访问我的站点时出现以下错误 http 本地主机 8000 http local
  • Nodejs 在异步上创建简单队列

    在下面的示例代码中 我可以同时运行多功能 Promise all sendMoneyToRequestedUser data saveTransferMoneyTransaction data then function results l
  • 如何在保存到数据库之前在JSP中转义html?

    我现在正在学习 JSP 和 Java 并写了一个 非常 简单的留言簿来开始使用 JSP 但我想确保没有人可以使用 CSS 因此我需要在将 HTML 代码保存到 mySQL 数据库之前删除它 我已经在这里搜索并找到了 PreparedStat
  • 更改 MVC 5 中的用户名 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在使用 ASP NET MVC5 和 Identity 2 0 测试版 用户可以更改用户名吗 我正在尝试使用 Use
  • IActionFilter 与 IResultFilter

    请解释一下 IActionFilter 和 IResultFilter 之间的区别 我了解 OnActionExecuting 发生在操作方法执行之前 OnActionExecuted 发生在操作方法执行之后 进一步了解执行操作方法意味着什
  • 如何让 firebase deploy --email 或 --token 参数起作用?

    我在使用这些 firebase 命令通过 firebase 部署 travis CI 时遇到问题 firebase deploy email FIREBASE USERNAME password FIREBASE PASSWORD fire
  • 通过javascript在html表格中动态添加一列

    我正在编写一个java脚本代码 它将在html中已经存在的表中动态附加一列复选框 我的 html 代码是这样的 table border 1 tr th Email id th th Em th tr table
  • QSignal Manager - 无法将多个信号连接到一个插槽

    我有 4 个 QLineEdits 和 4 个 QPushButtons 如果我单击 QPushButton 我想在相应的 QLineEdit 内设置一些文本 我想使用QSignalMapper来区分每个QButton及其对应的QLineE
  • 用于教育目的的公共 SQL 数据库

    我正在寻找一个可以免费访问的公开可用的 SQL 数据库 可以在其中运行一些SELECT免费查询一些有意义的数据 不是 item1 item2 item3 你见过吗 如果能附上一些教程就更好了 供应商并不那么重要 只要可以使用通用 JDBC
  • 复杂类型中的 XJC javaType 适配器

    我想让 XJC 在生成 bean 时在复杂类型中使用 javaType 标记 这是不允许的吗 我真的缺少好的文档和一些可以理解的错误消息 这是我正在尝试的操作 但失败并出现错误 编译器无法支持此转换自定义 它附加到错误的位置 或者与其他绑定
  • Django Rest Framework如何禁止用户更改用户名?

    我正在创造UserSerializer并希望允许用户创建新帐户但禁止他们更改用户名 有一个read only我可以应用该属性 但用户在创建新用户名时将无法设置用户名 但如果没有它 它允许我改变它 还有一个required不幸的是 该属性不能
  • Jquery 数据表主题隐藏页眉/页脚块

    我正在尝试删除该表的页眉 页脚块 Picture of what I am trying to remove 该表的Jquery代码 document ready function var oTable tableSmooth dataTa
  • 迭代器模式 - 错误 C2679:二进制 '<<':找不到采用 'std::string' 类型的右侧操作数的运算符 [重复]

    这个问题在这里已经有答案了 我正在尝试使用迭代器模式进行迭代和打印 但出现错误 这是错误 error C2679 binary lt lt no operator found which takes a right hand operand
  • C++11:如何使用 设置种子

    我正在练习随机库 这是 C 11 的新功能 我编写了以下最小程序 include