Python中的随机函数预测

Python中的随机函数预测,python,python-3.x,random,random-seed,Python,Python 3.x,Random,Random Seed,根据Random library的文档,假设开发人员没有提供任何种子(None),函数将使用系统当前时间作为种子(time.time()) 不幸的是,输出似乎没有反映文档 print(random.randrange(1,10)) a=time.time() . . . . random.seed(a) print(random.randrange(1,10)) 上面的代码产生了两种不同的输出,因此假设我使用windows 10(对于那些可能认为是Uradom供应商的人)和Python 3,我

根据Random library的文档,假设开发人员没有提供任何种子(None),函数将使用系统当前时间作为种子(time.time())

不幸的是,输出似乎没有反映文档

print(random.randrange(1,10))
a=time.time()
.
.
.
.
random.seed(a)
print(random.randrange(1,10))
上面的代码产生了两种不同的输出,因此假设我使用windows 10(对于那些可能认为是Uradom供应商的人)和Python 3,我的问题是:

1.为什么上面的代码不产生相同的输出

2.如何使其产生相同的输出


3.当我试图在Random.py中查找seed赋值部分时,我在任何地方都找不到time.time()赋值到Random.seed,因此如果有人能够引用该部分,我将不胜感激

这实际上是一个有趣的问题

首先,对
time.time()
的连续调用可能会得到相同的结果,但这主要是由于精度

[36]中的
:a=time.time();b=时间。时间()
In[37]:b-a
Out[37]:0.0
现在让我们跳进问题:

  • 它不会产生相同的输出,因为初始种子是如何生成的。如果查看
    seed()
    的源代码,您将看到它指定了
  • 因为没有对
    time.time()
    的引用,所以不能假设它使用它。事实上,您可以查看实现的源代码(如果您了解C)。如有必要,它有助于保证随机种子的一种方式是:

    static void
    random_seed_time_pid(RandomObject *self)
    {
        _PyTime_t now;
        uint32_t key[5];
    
        now = _PyTime_GetSystemClock();
        key[0] = (uint32_t)(now & 0xffffffffU);
        key[1] = (uint32_t)(now >> 32);
    
        key[2] = (uint32_t)getpid();
    
        now = _PyTime_GetMonotonicClock();
        key[3] = (uint32_t)(now & 0xffffffffU);
        key[4] = (uint32_t)(now >> 32);
    
        init_by_array(self, key, Py_ARRAY_LENGTH(key));
    }
    
    有多个对不同时钟和进程ID的调用。与
    time.time()
    无关。由于种子是如何产生的,两个连续的种子不可能是相同的

  • 如果你想让某些东西产生同样的产出,你需要同样的种子
  • [42]中的
    :导入随机
    在[43]中:a=time.time()
    [44]中:随机种子(a)
    In[45]:随机。随机范围(100)
    Out[45]:98
    In[46]:random.randrange(100)
    Out[46]:94
    在[47]中:随机。种子(a)#重置
    In[48]:random.randrange(100)
    Out[48]:98
    
    不过,它不需要是一个数字。你可以有很多不同的选择

  • 希望上面提供的源代码能够解决这个问题

  • 当然它们是不同的,
    time.time()
    对于两个连续的调用将不相同……您希望如何生成相同的随机值?第一条指令的时间与第二条指令的时间不同前两行代码之间的时间已过…时间飞逝:)执行
    random.randrange(1,10)
    时的时钟与执行
    time.time()
    时的时钟不同。“我如何使它产生相同的输出“:首先捕捉时间,首先,感谢你的详细回答。因此,如果种子是由两个不同的时钟产生的,我很难预测,而PID是我根本无法预测的,那么随机库是完全安全的。这个结论与我之前的研究相矛盾,我之前的研究认为随机库对于密码学来说是不安全的目的和可利用性编辑不是加密安全的。它实现了Mersenne捻线器。请看)。我应该澄清:种子与加密安全无关。MT算法本身并不安全,因为输出是可预测的。
    static void
    random_seed_time_pid(RandomObject *self)
    {
        _PyTime_t now;
        uint32_t key[5];
    
        now = _PyTime_GetSystemClock();
        key[0] = (uint32_t)(now & 0xffffffffU);
        key[1] = (uint32_t)(now >> 32);
    
        key[2] = (uint32_t)getpid();
    
        now = _PyTime_GetMonotonicClock();
        key[3] = (uint32_t)(now & 0xffffffffU);
        key[4] = (uint32_t)(now >> 32);
    
        init_by_array(self, key, Py_ARRAY_LENGTH(key));
    }