当前位置: 首页 > 面试题库 >

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

西门经国
2023-03-14
问题内容

下面的代码旨在生成间隔为[1,100]的五个伪随机数的列表。我为default_random_enginewith设置了种子time(0),它以unix时间返回系统时间。当我使用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上,第一个数字会定期增加一个。获得上述输出后,我等待了大约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;
    
  • 该引擎生成随机数的方式是x i + 1 =(16807x i + 0)mod 2147483647。

  • 因此,如果种子相差1,则大多数情况下,第一个生成的数字通常相差16807。

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

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

MSVC default_random_enginemt19937,没有这个问题。



 类似资料:
  • 我是java编程新手,我正在使用数据库创建一个简单的银行管理系统。我需要创建一个账号为9位的用户账户,而不是以0开头。此外,所有的账号都必须不同。每次我运行程序时,它应该给我一个9位的号码,这个号码没有存储在“login_info”数据库中“account_number”下的“账户”表中。知道如何做到这一点吗?谢谢。

  • 本文向大家介绍在C ++中生成相同总和的对的最大数量,包括了在C ++中生成相同总和的对的最大数量的使用技巧和注意事项,需要的朋友参考一下 给我们一个整数数组。目的是在数组中找到最大对数,相加后将产生相同的总和。我们必须找到此类对的最大数量。 输入值 输出结果 说明-数字对的总和- 输入值 输出结果 说明-数字对的总和- 以下程序中使用的方法如下 整数数组Arr []用于存储整数。 整数“大小”存

  • 当使用相同的种子(例如12345)时,是否有任何选项可以像Numpy random一样在Java中生成相同的随机数。 在Numpy中,我得到的代码低于输出: 在Java中,我从下面的代码中获得输出: 我在Java中比较了SciKit学习和我自己的库中的一些方法的输出。为了生成相同的输出,我需要像Numpy一样生成相同的随机值(SciKit学习使用Numpy随机值)。

  • 问题内容: 我正在尝试Java 7的 ThreadLocalRandom,并发现它在多个线程中生成完全相同的随机数。 这是我的代码,在其中创建5个线程,每个线程打印出5个随机数: 输出: 为什么对于每个线程和程序的每次执行都获得相同的随机数? 问题答案: 似乎有一个关于此问题的公开错误。看这里和这里

  • 我正在将C#脚本移植到Spark(Scala)中,我遇到了Scala中UUID生成与C#中GUID生成的问题。 有没有办法在 Java 中生成与 C# 中生成的 UUID 相同的 UUID? 我通过从字符串的MD5散列创建Guid来生成数据库的主键。最后,我希望在Java/Scala中生成与C#脚本中的UUIDs相匹配的UUIDs,这样数据库中使用C#实现进行散列的现有数据就不需要重新散列。 C#

  • 我如何在同一机器架构+映像(x86_64 Linux)上,从给定的种子跨不同的二进制生成一个保证的随机数序列?