我查看了随机和秘密之间的关系,发现秘密是“加密安全的”。每个人的堆栈溢出源都说它是最接近真正随机性的。所以我想用它来产生人口。但是,它根本没有给出非常随机的结果,而是可预测的结果。
我测试的第一个特征是性别,准确地说是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软件包会产生熵或混沌数?
秘密模块是否应该以某种可预测的方式起作用?
答案 0 :(得分:1)
我认为您可能在这里混淆了一些不同的想法。
secrets.choice
函数将在每次调用时提供的4个性别选项中随机选择1个,在您的示例中为2000000000次。在任何合理实现的随机性生成器中,从4个选项的列表中随机选择2000000000次后获得100%的选项的可能性实际上为零。
如果我正确理解了您的问题,则实际上是有力证据表明secrets.choice
函数的行为符合预期,并提供了均匀分布的选项。当您的N接近无穷大时,方差应降至零。