使用“”的不可重现的随机数

2023-12-25

我正在尝试创建一个类,为多个分布生成随机数,同时保持它们的可重复性(通过设置初始种子)。

该代码似乎有效,直到我开始使用正态分布和奇怪的错误表面。这些主要是:

  • 如果我取消注释double a = rnd.rnorm(0.0, 1.0);-line(第40行)(也就是说,如果我打电话rnorm在设置种子之前),正态分布的第一个随机数不再匹配,之后的随机数再次匹配
  • 如果我从正态分布中检索奇数个随机数,则正态随机数将移位 1(例如,将第 39 行设置为int n = 3;)
  • 如果我同时做这两件事,随机数就会向另一个方向移动一个(引导)

现在我的问题是,是什么导致了这种奇怪的行为?我实施了吗RNG以错误的方式?最重要的是,我该如何解决它?

Code

如果您想自己测试结果,可以使用这个http://cpp.sh/9phre http://cpp.sh/9phre

or this

#include <stdio.h>
#include <random>

// Class to create random numbers 
// Main functions to set the seed: setseed()
// create uniformly distributed values: runif()
// and normally distributed values: rnorm()
class RNG {
public:
    RNG(int seed = (int) time(0)) {
        setseed(seed);
    };
    ~RNG() {};
    void setseed(int newSeed) {
        re.seed(newSeed);
    };

    double runif(double minNum, double maxNum) {
        return dud(re, distUnifDbl::param_type{minNum, maxNum});
    };
    double rnorm(double mu, double sd) {
        return dnd(re, distNormDbl::param_type{mu, sd});
    };

private:
    // take the Mersenne-Twister Engine
    std::mt19937 re {};
    // create the uniform distribution
    using distUnifDbl = std::uniform_real_distribution<double>;
    distUnifDbl dud {};
    // create the normal distribution
    using distNormDbl = std::normal_distribution<double>;
    distNormDbl dnd {};

};

int main(int argc, char const *argv[]) {
    RNG rnd;
    int n = 4; // setting n to an odd number, makes _all_ normal numbers non-reproducible
    //double a = rnd.rnorm(0.0, 1.0); // uncommenting this, makes the _first_ normal number non-reproducible

    printf("Testing some Uniform Numbers\n");
    rnd.setseed(123);
    for (int i = 0; i < n; ++i) {
        printf("% 13.10f ", rnd.runif(0.0, 1.0));
    }
    rnd.setseed(123);
    printf("\n");
    for (int i = 0; i < n; ++i) {
        printf("% 13.10f ", rnd.runif(0.0, 1.0));
    }
    printf("\n");

    printf("\nTesting some Normal Numbers\n");
    rnd.setseed(123);
    for (int i = 0; i < n; ++i) {
        printf("% 13.10f ", rnd.rnorm(0.0, 1.0));
    }
    rnd.setseed(123);
    printf("\n");
    for (int i = 0; i < n; ++i) {
        printf("% 13.10f ", rnd.rnorm(0.0, 1.0));
    }
    printf("\n");
    return 0;
}

Results

基本情况

设置时n = 4并离开a评论后,我收到以下内容(这正是我想要/需要的;可重复的“随机”数字):

Testing some Uniform Numbers
 0.7129553216  0.4284709250  0.6908848514  0.7191503089 
 0.7129553216  0.4284709250  0.6908848514  0.7191503089 

Testing some Normal Numbers
-0.5696096995  1.6958337120  1.1108714913  0.9675940713 
-0.5696096995  1.6958337120  1.1108714913  0.9675940713 

Error 1

现在来说说错误。环境n = 5(或任何奇数),我收到:

Testing some Uniform Numbers
 0.7129553216  0.4284709250  0.6908848514  0.7191503089  0.4911189328 
 0.7129553216  0.4284709250  0.6908848514  0.7191503089  0.4911189328 

Testing some Normal Numbers
-0.5696096995  1.6958337120  1.1108714913  0.9675940713  1.5213608069 
-0.0482498863 -0.5696096995  1.6958337120  1.1108714913  0.9675940713 

这显然是shifts所有正常数字都减 1。统一数字保持不变(我想这很好)。

Error 2

取消注释一行(即调用rnd.rnorm(0.0, 1.0) once before设置种子),会产生以下输出(n = 4或任何其他偶数)

Testing some Uniform Numbers
 0.7129553216  0.4284709250  0.6908848514  0.7191503089 
 0.7129553216  0.4284709250  0.6908848514  0.7191503089 

Testing some Normal Numbers
 0.9761557076 -0.5696096995  1.6958337120  1.1108714913 
 0.9675940713 -0.5696096995  1.6958337120  1.1108714913 

这显然打破了只有第一个正常随机数,再次保留统一数字即可。

Error 3

一起使用这两个点(保留该行未注释并将 n 设置为奇数),我得到这个

Testing some Uniform Numbers
 0.7129553216  0.4284709250  0.6908848514  0.7191503089  0.4911189328 
 0.7129553216  0.4284709250  0.6908848514  0.7191503089  0.4911189328 

Testing some Normal Numbers
-0.4553400276 -0.5696096995  1.6958337120  1.1108714913  0.9675940713 
-0.5696096995  1.6958337120  1.1108714913  0.9675940713  1.5213608069 

现在,第二个正态随机数被移至另一个方向(前导)。

系统规格

我在 Ubuntu 16.04 上使用这个g++ --version g++(Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

Updates

它似乎没有连接到特定的发电机,即更换std::mt19937 re {}; with std:: linear_congruential_engine<std::uint_fast32_t, 48271, 0, 2147483647> re {};,或与std::subtract_with_carry_engine<std::uint_fast64_t, 48, 5, 12> re{};导致相同的行为(但显然数字不同)。


void setseed(int newSeed) {
        re.seed(newSeed);
        dud.reset(); // <---- 
        dnd.reset(); 
    };

发行版具有内部状态。您需要重置它才能再次获得相同的序列。

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

使用“”的不可重现的随机数 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 在r中将地图叠加在3D曲面地图之上

    我使用 rgl surface 创建了一个 3d 地图 主要遵循 Shane 在中的回答this https stackoverflow com questions 1896419 plotting a 3d surface plot wi
  • 如何在firefoxQuantum(浏览器版本57)中安装sqlite管理器插件

    我尝试在 Firefox 中安装 sqlite 管理器插件 但它显示错误 您的 Firefox Quantum 浏览器不兼容 我的 Firefox 浏览器版本是 57 0 4 此扩展取决于嵌入的 sqlite 引擎的接口 在火狐浏览器中 由
  • 使用 webdriver 的 Chrome 和 IE 驱动程序配置文件

    我的项目需要某些 cookie 才能访问该应用程序 对于 Firefox 驱动程序 我使用 firefox 配置文件 我用于手动测试的 ff 配置文件 因为它具有我想要的所有 cookie 来运行脚本 如何在 Chrome 和 IE 浏览器
  • Illustrator/SVG 到 JavaScript 的工作流程? (模板库?)

    在 Illustrator 中 另存为 SVG 时 这是典型的结果
  • 无法使用 YAML Spring Profile 禁用 @Cacheable

    我创建了一个名为 mycache 的缓存 该缓存应用于我的服务中的方法 例如 Cacheable value mycache public String getValue String something breakpoint here 我
  • WKT中如何处理Circle?

    我有一个 json 对象 区域 圆形 28 625360369528934 77 2227479486792 3135 6 如何使用WKTreader解析它 你需要回到写下它的人那里并解释一下CIRCLE不属于WKT标准 http www
  • 存储设置的最佳实践

    我有一个相当大的 C 应用程序 在 Windows 上 没有计划其他平台 它当前将所有设置 甚至某种地址 存储在 Windows 注册表中 有时这很不方便 因为用户很难更改注册表中的条目 我希望对设置进行版本控制 以便设置始终与当前代码匹配
  • SPARQL 对聚合值应用 MAX [重复]

    这个问题在这里已经有答案了 我有这样的疑问 prefix
  • R闪亮-带有选项的弹出窗口

    我正在创建一个查询 SQL 数据库的闪亮应用程序 如果查询的数据有两个日期的条目 我想警告用户 此外 我希望用户能够选择要查询的数据集 这是一个例子 Server Create example data set seed 10 Measur
  • (如何)终端服务/远程桌面可以用来共享Access数据库吗?

    我以前使用过的唯一类型的 远程桌面 应用程序是 VNC 查看器 我对这种应用的理解是 当多个用户登录同一个VNC服务器时 他们共享键盘 鼠标和桌面 因此只有一个人可以实际使用计算机 而其他用户可以观看正在发生的事情 这显然有它自己的用途 我
  • Metastore_db 不是在 Windows 7 中使用 apache Spark 2.2.1 创建的

    我想使用最新的读取 CSV 文件Apache Spark Version i e 2 2 1 in Windows 7 via cmd但无法这样做 因为存在一些问题metastore db 我尝试了以下步骤 1 spark shell pa
  • 在逗号分隔列表上进行 Sub 和 Join

    我正在尝试构建一个 ECS Fargate 任务定义 该定义使用传递给命令的可变数量的环境变量 每个变量名称都与 SecretsManager 中的一个秘密相匹配 我无法以有意义的方式组合这些功能 以下代码只是将所有变量作为字符串列表传递给
  • 如何使 div *不*扩展以填充其父级?

    我有一个 div 包裹着图像 如下所示 div class containing div div class image wrapper img src image jpg div div class unrelated stuff Bla
  • Plotly:如何为所有子图设置xticks?

    我无法操纵所有子图上的 xticks 我正在使用的 xticks 方法 根据文档 仅更改最顶层子图的 xticks 如何更改下部子图的 xticks 下面是我的代码 fig make subplots rows 2 cols 1 fig a
  • PostgreSQL:如何索引所有外键?

    我正在使用一个大型 PostgreSQL 数据库 并且正在尝试调整它以获得更高的性能 我们的查询和更新似乎使用外键进行了大量查找 我想要的是一种相对简单的方法来向所有外键添加索引 而不必遍历每个表 140 并手动执行 在研究这个问题时 我发
  • 处理来自 ADFS 的 JWT 不记名令牌

    我正在测试一个 Web 应用程序 API 该 API 使用 X509 证书对 ADFS 服务器进行身份验证 为了使用空手道运行测试 我目前使用一个小型 NET 应用程序 该应用程序使用我安装的证书协商 JWT 进行 SSO 然后 我从 Fi
  • Javascript 相当于 iOS 的“tap”事件,但适用于 Android

    我正在使用 jqtouch 制作一个触摸优化网站 对于 iOS 我将 tap 绑定到点击侦听器 但这不会在 Android 中注册 我尝试使用 touchend 它可以工作 但它会覆盖任何类型的拖动 当用户试图做的只是滚动时单击项目 对于
  • C# 中的锁定关键字

    我从MSDN上了解到lock关键字的主要作用 lock 语句 C 参考 lock 关键字标记一条语句 块作为关键部分 获取互斥锁 对于给定的对象 执行 声明 然后发布 锁 什么时候应该使用锁 例如 它对于多线程应用程序很有意义 因为它可以保
  • 如何在 C# 中使网页浏览器控件变为空白?

    最初 当网络浏览器刚刚加载到表单上时 它是空白的 即白色 一旦我们进入某个特定网站 有没有办法让它再次变成空白 我尝试过这些方法 但没有找到一种可以实现这一点的方法 还有其他方法还是我错过了什么 尝试一下 webBrowser1 Navig
  • 使用“”的不可重现的随机数

    我正在尝试创建一个类 为多个分布生成随机数 同时保持它们的可重复性 通过设置初始种子 该代码似乎有效 直到我开始使用正态分布和奇怪的错误表面 这些主要是 如果我取消注释double a rnd rnorm 0 0 1 0 line 第40行