Python机密模块的行为可预测

时间:2019-04-10 19:27:54

标签: python python-3.x

我查看了随机和秘密之间的关系,发现秘密是“加密安全的”。每个人的堆栈溢出源都说它是最接近真正随机性的。所以我想用它来产生人口。但是,它根本没有给出非常随机的结果,而是可预测的结果。

我测试的第一个特征是性别,准确地说是4,并将其全部绘制出来...

# code may not function as it's typed on mobile without a computer to test on

import secrets
import multiprocessing


def gen(args*):
    gender = ["Male", "Female", "X", "XXY"]
    rng = secrets.choice(gender)
    return rng

with multiprocessing.Pool(processes=4) as pool:
    id_ = [I for I in range (2000000000)]
    Out = pool.map(gen, id_)
    # Do stuff with the data

当我通过其他确定1种性别对另一种性别的百分比的函数处理数据时,它总是25 + 1%。我原本希望偶尔会有100%的1个性别和0个其他性别,但这从未发生。

我还随机尝试了同一件事,它产生了相似的结果,但是以某种方式花费了两倍的时间。

我还更改了列表的性别,使其具有X和XXY之一,而其他两个具有49,并且可以预期得到1%X和1%XXY的结果。

除了术语“熵”之外,我在计算机上没有太多的RNG经验... Python是否有任何本机或PYPI软件包会产生熵或混沌数?

秘密模块是否应该以某种可预测的方式起作用?

1 个答案:

答案 0 :(得分:1)

我认为您可能在这里混淆了一些不同的想法。

secrets.choice函数将在每次调用时提供的4个性别选项中随机选择1个,在您的示例中为2000000000次。在任何合理实现的随机性生成器中,从4个选项的列表中随机选择2000000000次后获得100%的选项的可能性实际上为零。

如果我正确理解了您的问题,则实际上是有力证据表明secrets.choice函数的行为符合预期,并提供了均匀分布的选项。当您的N接近无穷大时,方差应降至零。