【问题标题】:Randomness of Shuffle in PythonPython中随机播放的随机性
【发布时间】:2016-05-05 02:34:27
【问题描述】:

我指的是 Python 随机模块的 shuffle 功能。

from random import shuffle

list = [1, 2, 3, 4]

shuffle(list)

我猜上面的函数使用随机种子。我知道在 C 中,rand 函数会迭代计算机中的一些随机种子数。因此,当循环函数时,随机函数不再变得随机。

shuffle 函数的工作方式与 C 中的 rand 函数类似吗?如果是这样,我如何添加自己的随机种子? (我正在考虑以毫秒为单位的时间来得出独特的价值)。

之前就这个问题的已接受答案发表了评论,但没有得到任何回复 (Shuffling a list of objects in python)

编辑:

我想确保随机洗牌不会在循环中重复其洗牌方法。例如,

我想随机播放 [1, 2, 3, 4, 5, 6]

我循环了超过 10000 次。

它产生以下结果: [1、3、2、4、5、6] [2、1、4、5、3、6] ...(大量不同的洗牌组合) [1、3、2、4、5、6] [2、1、4、5、3、6] ...(重复模式)。

我想避免上述行为,因为我正在循环大量数据。上述行为会首先发生吗?如果是这样,我是否必须在一定数量的循环后更改种子?

【问题讨论】:

  • “迭代计算机中的几个随机种子数”是什么意思?你是在问输出是否是确定性的?您是在问它是“真正”随机还是只是伪随机?
  • 我回答了您的评论,但这个问题表明缺乏任何研究工作(因此被否决) - 确切的行为在 random module 中有明确记录。
  • 您的后续问题也在文档中得到解答; random 模块“周期为 2**19937-1”,这意味着它会在经过这么多步骤后输出相同的值序列。如果不清楚,那是一个巨大的数字。出于所有实际目的(密码学除外),它与真正的随机性没有区别。

标签: random-sample


【解决方案1】:

我知道在 C 中,rand 函数在计算机中迭代一些随机种子数。

不,它没有。它使用您使用srand 设置的任何种子,如果您没有调用srand,则使用1。

shuffle 函数的工作方式与 C 中的 rand 函数类似吗?如果是这样,我如何添加自己的随机种子? (我正在考虑以毫秒为单位的时间来得出独特的价值)。

Python's random module uses either system time or OS-provided randomness sources to seed the RNG:

random.seed([x])

初始化基本随机数生成器。可选参数 x 可以 是任何可散列的对象。如果省略 xNone,则为当前系统时间 用来; 当前系统时间也用于初始化生成器 首次导入模块时。如果提供随机源 由操作系统使用,而不是系统时间(请参阅 os.urandom() 函数了解可用性的详细信息)。

在 2.4 版中更改: 以前,操作系统资源不是 用过。

【讨论】:

    【解决方案2】:

    几乎所有的模块函数都依赖于基本函数random(),它 在半开放范围 [0.0, 1.0) 内均匀生成随机浮点数。 Python 使用 Mersenne Twister 作为核心生成器。它产生 53 位精度浮点数,周期为 2**19937-1。底层证券 C 中的实现既快速又线程安全。梅森捻线机 是最广泛测试的随机数生成器之一 存在。但是,由于是完全确定性的,因此不适合 用于所有目的,并且完全不适合加密 目的。

    random 模块还提供了 SystemRandom 类,它使用 系统函数 os.urandom() 从源生成随机数 由操作系统提供。

    警告不应使用此模块的伪随机生成器 出于安全目的。如果需要,请使用 os.urandom() 或 SystemRandom 一个加密安全的伪随机数生成器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-29
      • 2023-01-23
      • 1970-01-01
      • 2014-04-02
      • 2014-08-29
      • 2019-09-19
      • 2015-11-16
      • 1970-01-01
      相关资源
      最近更新 更多