在 Linux 中生成相同的数字,但在 Windows 中则不然

2024-04-24

下面的代码旨在生成区间 [1,100] 中的五个伪随机数的列表。我播种default_random_engine with time(0),它返回系统时间UNIX时间 https://en.wikipedia.org/wiki/Unix_time。当我使用 Microsoft Visual Studio 2013 在 Windows 7 上编译并运行该程序时,它按预期工作(见下文)。然而,当我在 Arch Linux 中使用 g++ 编译器执行此操作时,它的行为很奇怪。

在Linux中,每次会生成5个数字。每次执行时最后 4 个数字都会不同(通常是这种情况),但第一个数字将保持不变。

Windows 和 Linux 上 5 次执行的输出示例:

      | Windows:       | Linux:        
---------------------------------------
Run 1 | 54,01,91,73,68 | 25,38,40,42,21
Run 2 | 46,24,16,93,82 | 25,78,66,80,81
Run 3 | 86,36,33,63,05 | 25,17,93,17,40
Run 4 | 75,79,66,23,84 | 25,70,95,01,54
Run 5 | 64,36,32,44,85 | 25,09,22,38,13

更神秘的是,第一个数字在 Linux 上会定期递增 1。获得上述输出后,我等了大约30分钟,再次尝试发现第一个数字已经改变,现在总是生成为26。它继续周期性地增加1,现在为32。它似乎对应随着价值的变化time(0).

为什么第一个数字在运行过程中很少发生变化,而当变化时,则增加 1?

代码。它整齐地打印出 5 个数字和系统时间:

#include <iostream>
#include <random>
#include <time.h>

using namespace std;

int main()
{
    const int upper_bound = 100;
    const int lower_bound = 1;

    time_t system_time = time(0);    

    default_random_engine e(system_time);
    uniform_int_distribution<int> u(lower_bound, upper_bound);

    cout << '#' << '\t' << "system time" << endl
         << "-------------------" << endl;

    for (int counter = 1; counter <= 5; counter++)
    {
        int secret = u(e);
        cout << secret << '\t' << system_time << endl;
    }   

    system("pause");
    return 0;
}

这是发生的事情:

  • default_random_engine在libstdc++(GCC的标准库)中是minstd_rand0,这是一个简单的线性同余引擎:

    typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> minstd_rand0;
    
  • The way this engine generates random numbers is xi+1 = (16807xi + 0) mod 2147483647.

  • 因此,如果种子相差 1,那么大多数时候第一个生成的数字将相差 16807。

  • 该生成器的范围是 [1, 2147483646]。 libstdc++ 的方式uniform_int_distribution将其映射到 [1, 100] 范围内的整数本质上是这样的:生成一个数字n。如果数字不大于2147483600,则返回(n - 1) / 21474836 + 1;否则,请使用新号码重试。

    应该很容易看出,在绝大多数情况下,两个n在此过程下,仅相差 16807 的 s 将在 [1, 100] 中产生相同的数字。事实上,人们预计生成的数字大约每 21474836 / 16807 = 1278 秒或 21.3 分钟增加 1,这与您的观察结果非常吻合。

MSVC's default_random_engine is mt19937,不存在这个问题。

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

在 Linux 中生成相同的数字,但在 Windows 中则不然 的相关文章

随机推荐

  • 如何设置USB连接模式?

    我正在编写一个应用程序 该应用程序应该将数据转储到 SD 卡上 然后在 PC 上编写另一个应用程序 当设备连接到 PC 时 在光盘驱动器模式下 该应用程序应该读取数据 在我的 HTC Legend 上 有一个对话框可供选择 仅充电 HTC
  • Rails:检索嵌套数据时出错

    我尝试模拟一个系统 其中学生在与练习相关的盒子中工作 class Student lt ActiveRecord Base belongs to box class Box lt ActiveRecord Base belongs to p
  • WPF可编辑组合框IsFocused问题

    我正在开发一个带水印的ComboBox通过修改ComboBox ControlTemplate 当一切都很好ComboBox不处于可编辑模式 但是当我将编辑模式更改为 True 时 IsFocused属性永远不会设置为 True 这是因为在
  • 为什么复制 eval 会改变它的行为?

    根据rollupjs 文档 https rollupjs org guide en eval2 eval 简单地 复制 eval 为您提供了一个执行完全相同操作的函数 但该函数在全局范围而不是本地范围内运行 var eval2 eval f
  • 如何避免硬编码密钥进行加密(目标 C)?

    在我的 Objective C 代码中 我在代码中硬编码了一个消费者密钥和秘密 以用于 SHA 1 加密 我想知道是否可以避免硬编码以提高安全性 到目前为止我发现了以下内容 发现1 https www owasp org index php
  • ECMAScript 6 的 function.name 属性

    简单问题 这段代码的正确结果是什么 let f function let n f name or f 根据兼容表 http kangax github io compat table es6 n应该有这个值 f 然而 Mozilla 文档
  • 正则表达式捕获部分行

    我一直在努力捕获 snmp 响应的一部分 Text IF MIB ifDescr 1 1 1 g1 Office to DMZ Regex P
  • 如何使用我自己的 CSS 设计 Twitter 小部件的样式

    我有自己的 Twitter feed 设计 并且我想使用我自己的设计来设计默认 feed 的样式 有没有办法做到这一点 问题是您无法使用 CSS 选择器 因为它仅在加载页面后才出现 请检查这张图片 让您更多地了解我需要什么 Thanks 好
  • 使用 FileSystemWatcher 从文件中获取新行

    我正在观看一个包含以下代码的文件 FileSystemWatcher watcher new FileSystemWatcher watcher Path C watcher Filter t log watcher Changed new
  • matlab中的分箱

    我一直无法在 matlab 或 Octave 中找到函数来完成我想要的操作 我有一个两列的矩阵 m x 和 y 值 我知道我可以通过执行 m 1 或 m 2 来提取列 我想将其分成 可能 大小相等的较小矩阵 并绘制这些矩阵的平均值 换句话说
  • 替换sql server 2000中的ntext(超过4000个字符)

    如何替换sql server 2000中ntext列中超过4000个字符的文本 转换为 nvarchar max 不起作用 因为它会截断值 使用 TEXT NTEXT 是一团糟 这是尽快摆脱这些字段的众多原因之一 您需要使用 READTEX
  • 如何在Linux内核中启用CONFIG_PREEMPT选项?

    我是 Linux 内核编程的新手 尝试在 x86 64 上使用旧内核 Linux 2 6 32 我想启用其中的 CONFIG PREEMPT 选项 但找不到有关如何执行此操作的信息 我可以使用我的首选选项编译新内核 但不知道在这种情况下我需
  • 如何在没有 JoinTables 的 JPA 中创建一对多关系?

    我正在尝试使用以下表结构在 JPA 中创建 OneToMany 关系 CATALOG catalogId PK name PRODUCT productId PK name catalogId FK 我将类定义为 Entity public
  • Neo4j - 计算带有标签的节点

    我想要一个查询来计算数据集中有多少个节点具有每个标签 例如 标签A 100 标签B 200 我可以为每个单独的标签执行此操作 例如 MATCH n LabelA return count n 但是 我想在一个命令中为每个标签执行此操作 尝试
  • 普通的 console.warn() 显示在日志中,并带有服务器性“错误”

    当我记录一些东西时console warn 它似乎出现在 Stackdriver 日志中 严重性为 错误 Stackdriver 错误报告不显示这些错误 因此它们似乎不被视为错误 这使得无法过滤日志以仅显示错误 读取 Stackdriver
  • iFrame 中的 Angular2 不安全资源 URL 与 DomSanitationService

    背景 我正在为我们正在研究的过渡策略进行概念验证 该策略将在我们致力于将现有功能转换为 Angular 的同时将 旧 Web 应用程序引入 iFrame Issue 我遇到的问题是尝试在 iFrame 上设置 src 标记 我正在尝试使用
  • REST 何时/如何取代 SOAP [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我目前正在写关于 IT 技术等的论文
  • 如何在php中检查来自其他网站的cookie并不允许访问我的网站?

    如何在php中检查来自其他网站的cookie并不允许访问我的网站 如果客户端有 cookie 示例 如果有来自 www example com 的 cookie 它会被重定向到其他网站吗 请帮助我其他网站上的一些人对我的不良网站发表评论 我
  • Android - 将 ProgressBar 设置为垂直条而不是水平条?

    我正在尝试使用 ProgressBar 作为类似计量的显示 我认为这将是一个简单的任务 并认为 ProgressBar 有一个属性可以设置为垂直 但我没有看到任何东西 此外 我希望能够在栏的侧面显示类似标尺的指示器 以清楚地指示当前级别 感
  • 在 Linux 中生成相同的数字,但在 Windows 中则不然

    下面的代码旨在生成区间 1 100 中的五个伪随机数的列表 我播种default random engine with time 0 它返回系统时间UNIX时间 https en wikipedia org wiki Unix time 当