【问题标题】:Is random.sample truly random?random.sample 真的是随机的吗?
【发布时间】:2016-10-07 17:16:14
【问题描述】:

我有一个包含155k 文件的列表。当我random.sample(list, 100) 时,虽然结果与之前的样本不同,但它们看起来很相似。

有没有比random.sample 更好的替代方法来返回一个包含随机 100 个文件的新列表?

folders = get_all_folders('/data/gazette-txt-files')
# get all files from all folders
def get_all_files():
    files = []
    for folder in folders:
        files.append(glob.glob("/data/gazette-txt-files/" + folder + "/*.txt"))

    # convert 2D list into 1D
    formatted_list = []
    for file in files:
        for f in file:
            formatted_list.append(f)

    # 200 random text files
    return random.sample(formatted_list, 200)

【问题讨论】:

  • 整个random 库是伪随机的。没有半衰期衰减,除了网络噪声之外,还有什么是“真正”随机的。
  • 通常,随机性的主要问题是人类对随机性的感知是完全错误的。我们不断在完全随机的信号中看到“非随机”模式。我们的大脑就是这样工作的。
  • 如果你想要更可靠的随机性,请实例化SystemRandom()。尽管如此,您可能只需要相信 python 的随机性在这一点上非常好,考虑到如果它有任何问题,它早就已经解决了。
  • “看起来相似”是什么意思?到生日 Paraox 时,您在前一个样本中点击至少一个文件的可能性非常大,大约为 1-exp(-(100)^2 / (2*155000)) = 3.2%

标签: python python-3.x random


【解决方案1】:

出于从列表中随机选择元素之类的目的,使用random.sample 就足够了,没有提供真正的随机性,我不知道这在理论上是否可行。

random(默认情况下)使用称为 Mersenne Twister (MT) 的 Pseudo Random Number Generator (PRNG),虽然它适用于模拟等应用程序(以及从路径列表中挑选等小事),但不应该用于由于it is deterministic而存在安全问题的领域。

这就是为什么 Python 3.6 还引入了 secrets.pyPEP 506,它默认使用 SystemRandom (urandom) 并且能够生成 cryptographically secure pseudo random numbers

当然,底线是,即使您使用 PRNG 或 CPRNG 生成数字,它们仍然是伪随机的。

【讨论】:

    【解决方案2】:

    您可能需要为生成器播种。请参阅文档中的 here

    请在获得样品前致电random.seed()

    【讨论】:

    • 自动播种。
    • 可能在模块导入时,如文档current system time is also used to initialize the generator when the module is first imported 中所述。如果你不比可能不是。我找不到任何其他说明的文档。
    • @Jim Fasarakis-Hilliard 感谢您的编辑。没有冗长的网址会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多