打包(类型擦除)随机数生成器

2024-01-26

C++11 std 库有几个随机数生成器 (RNG),每个都实现了这个概念统一随机数生成器 http://en.cppreference.com/w/cpp/concept/UniformRandomNumberGenerator。然后可以将它们用作随机分布的参数,另请参阅本文档 http://en.cppreference.com/w/cpp/numeric/random以获得概述。

这种设计的优点是底层 RNG 引擎的选择与其应用程序解耦。然而,设计还要求对 RNG 的所有调用的定义(不仅仅是声明)可用(如果 RNG 类型保持未指定为模板参数)。因此,在

struct complicated_random_distribution
{
  /*
     some data and auxiliary methods here
  */
  // complicated; may call RNG::operator() many times
  template<typename RNG>
  some_type operator()(RNG&gen) const;
};

会员operator()不能直接在单独的编译单元(CU)中实现,但必须在同一个头文件(或一个#included)。

对于单独的实现,理想情况下需要某种方式来打包 RNG,就像std::function<>打包任何可调用对象。 (只需使用std::function并提供以下值RNG::min() and RNG::max()因为在单独的 CU 中定义的函数的参数是有限制的,并且不允许使用,例如,std::uniform_real_distribution<>里面)。

如何才能做到这一点?是否有可用的实现? std 库将来会提供这个吗?或者我是在转移注意力?


Edit随机数生成器需要具有static会员min() and max(),使得类型擦除变得困难或不可能(GNU 的 libstdc++ 没有做出这个假设,并且使用非静态成员进行类型擦除min() and max()可以工作,但不能与 LLVM 的 libc++ 一起使用,它使用所需的标准static成员)。还有办法解决这个问题吗?如果不是,这是否意味着 C++ 标准有一个糟糕的随机数生成器接口?


调整 RNG 为independent_bits_engine,然后输入擦除适应的 RNG。您完全了解什么independent_bits_engine's min() and max() are.

这是一个草图:

struct RNG_wrapper {
    using result_type = std::uint32_t;
    static constexpr result_type min() { return 0; }
    static constexpr result_type max() { return 0xFFFFFFFF; }

    template<class RNG>
    using my_engine_type = std::independent_bits_engine<RNG, 32, result_type>;

    template<class RNG,
             class = std::enable_if_t<!std::is_same<std::decay_t<RNG>, RNG_wrapper>{}>>
    RNG_wrapper(RNG&& r)
        : rng(my_engine_type<std::decay_t<RNG>>(std::forward<RNG>(r))) {}

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

打包(类型擦除)随机数生成器 的相关文章

  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • Netsuite Suitescript可以修改文件柜中的文件吗?

    我有一个很大的产品列表 需要生成它的静态文件 并让该文件可以在我的网站中访问 目前 我生成列表 并将其上传到文件柜 我希望自动化这个过程 我想安排一个 SuiteScript 每晚运行并生成此列表并更新文件柜中的文件 这可以做到吗 than
  • HTTP 直播 MPEG TS 段

    我使用 FFMPEG 和免费分段器 Carson Mcdonald s 来生成我的 ts 片段 然后将其保存到网络服务器并通过播放 m3u8 来使用 Quicktime 进行播放 如果我有段 1 2 3 4 和另一个包含段 1 2 3 4
  • 解释一下莫名其妙的死锁

    首先 我不明白我怎么能得到any根本没有死锁 因为我没有使用显式锁定 所以只涉及一个表 每个进程都有一个单独的进程来插入 选择和更新行 一次只插入或更新一行 并且每个进程很少 也许一分钟一次 完全运行 这是一个电子邮件队列 CREATE T
  • 从 Visual Studio 在 Linux docker 容器中调试 nunit 测试

    我正在尝试更改我们的 NET Core 3 0 应用程序以在 Linux 容器中运行 我已经到了可以在容器内恢复和构建的地步 但测试失败了 这是预期的 该应用程序中的某些内容仅适用于 Windows 计算机 我想从 Windows 上的 V
  • 配置 Play 1.x/JPA 以顺序生成实体 ID?

    强制 Play JPA 使实体 ID 连续的最佳方法是什么 他们不是 https stackoverflow com questions 9771532 are jpa ids sequential 一种想法是将 play db jpa M
  • 谁能告诉我当我尝试添加syncfusion_flutter_pdfviewer包时flutter中的这个错误是什么

    当我在 yaml 文件中添加syncfusion flutter pdfviewer 包时 出现以下错误 谁能告诉我那个错误状态是什么 C src flutter pub cache hosted pub dartlang org sync
  • 如何在Docker中使用“绑定挂载”

    运行此命令后 我在日志中收到错误 docker run d p 3000 80 name Feedback app v 反馈 app feedback v WorkSpace d data volumes 03 adj node code
  • 如何在Linux命令行中运行jar文件

    如何将类路径设置为当前目录并运行名为的 jar 文件load jar通过提供参数作为当前目录中的内容load 2从 Linux 命令行 我确实尝试按如下方式运行该 jar 但它从其他目录执行类 java cp load jar CLASSP
  • 通过多线程访问文件

    我想通过10个线程访问一个大文件 文件大小可能从30MB到1GB不等 然后通过10个线程处理文件中的每一行并将它们写入另一个文件 如果我只使用一个线程访问IO 其他线程就会被阻塞 该处理花费的时间几乎相当于从文件系统读取一行代码 还有一个限
  • Python 如何实现其类型对象,即类型类型始终是类型?

    我知道Python中的所有东西都是一个对象 并且这些对象的 类型 或类 是 类型 另外 类型的类型也是类型本身 正如解释得很好here http www cafepy com article python types and objects
  • Whatsapp://send?text 将字符串从“&”字符剪切到末尾? [复制]

    这个问题在这里已经有答案了 我正在尝试添加可在 WhatsApp 中共享的链接 例如 whatsapp send text http www example com products women dresses sessionid 3456
  • 为什么调用 DataTable().draw() 时 columns.render 不执行?

    我很困惑为什么列 渲染 https datatables net reference option columns render不包含在执行管道中数据表 draw https datatables net reference api dra
  • 如何在 GWT 中深度复制任意对象?

    我有一个标记为可序列化的任意对象 它有各种可变的子对象 表示货币金额 集合等 我希望能够克隆这个对象 这样如果用户修改它然后恢复他们的操作 我可以用新的克隆替换该克隆 这意味着我需要深层复制 因为我不希望用户对原始对象上出现的子对象进行更改
  • UNIQUE 约束失败:auth_user.username

    我试图将名字和姓氏直接从 Facebook API 存储到用户身份验证模型 使用 FacebookProfile 模型扩展 包含 webpull id 和year formed 模型 py class FacebookProfile mod
  • 使用 PHP 或 Javascript 检查 iOS 版本是否为 3.0 或更高版本

    我需要检查访问我网站的 iOS 设备是否安装了 iOS 3 0 或更高版本 我可以这样做吗 如果您想检查哪些浏览器 移动设备正在访问您的网站 那么答案是您可以使用读取 userAgent 字符串并搜索操作系统和号码 例如 Mozilla 5
  • django 中带有 django 表单的预选复选框

    我试图在中显示预先选定的复选框Django option forms BooleanField required False initial True but the checkbox显示已检查 我正在使用django 1 3 beta 我
  • 我已经注册了应用程序 ID,但仍然显示您没有适用于 iOS 应用程序的合格捆绑包 ID。在这里注册一个

    我已经注册了App ID 使用通配符和不使用通配符都有 这不是我第一次创建应用程序 ID 并将其提交到应用程序商店 但是在developer apple com上注册appID后 当我尝试在 itunesconnect apple com
  • 在Python中写入打开的文件时的分割函数[重复]

    这个问题在这里已经有答案了 所以我有一个程序 我应该在其中获取一个外部文件 用 python 打开它 然后分隔每个单词和每个标点符号 包括逗号 撇号和句号 然后我应该将该文件保存为文本中每个单词和标点符号出现时的整数位置 例如 我喜欢编码
  • 为什么 Window.Close 事件会传播?

    我遇到了一个奇怪的情况Close子窗口的事件传播到父窗口并导致其关闭 我做了一个最小的例子 如下所示 For TestWindow除了VS生成的默认WPF窗口之外什么都没有 and in App xaml cs我覆盖OnStartup事件并
  • 打包(类型擦除)随机数生成器

    C 11 std 库有几个随机数生成器 RNG 每个都实现了这个概念统一随机数生成器 http en cppreference com w cpp concept UniformRandomNumberGenerator 然后可以将它们用作