【问题标题】:How to use optional argument of random.shuffle in Python如何在 Python 中使用 random.shuffle 的可选参数
【发布时间】:2020-01-30 20:18:57
【问题描述】:

来自 random.shuffle(x[, random]) 的doc,它说:

可选参数 random 是一个 0 参数函数,返回 [0.0, 1.0) 中的随机浮点数;默认情况下,这是函数 random()

有人能解释一下0-argument function 的含义,并举一个random.shuffle() 的例子和可选参数random 吗?我搜索但找不到该案例的任何示例。另外,“这是函数random()”是什么意思? this 是否引用可选参数?

【问题讨论】:

    标签: python random


    【解决方案1】:

    随机参数是种子。然后,如果你总是使用相同的种子,它总是用相同的逻辑重新排列你的数组。请参见示例。 5 在索引 4 并转到 0。 6 转到 4(旧索引 5)然后如果我们重用相同的种子,6 转到索引 0,因为 6 在索引 4 处,就像第一次洗牌时的 5
    示例:

    >>> import random
    >>> r = random.random()
    >>> r
    0.4309619702601998
    >>> x = [1, 2, 3, 4, 5, 6]
    >>> random.shuffle(x, lambda: r)
    >>> x
    [5, 1, 4, 2, 6, 3]
    >>> random.shuffle(x, lambda: r)
    >>> x
    [6, 5, 2, 1, 3, 4]
    >>> x = [1, 2, 3, 4, 5, 6]
    >>> random.shuffle(x, lambda: r)
    >>> x
    [5, 1, 4, 2, 6, 3]
    

    Source

    【讨论】:

    • 您的分析器缺少的是作者要求的“0-argument 函数的含义”的解释。
    • 是的,它们是我正在寻找的一部分(带有可选参数的 random.shuffle 示例)。但是当我第一次阅读你的帖子时,我吃了一惊,里面有很多相同类型的例子,没有任何解释。
    • 亲爱的@TimothéeDautrême,非常感谢您的帮助,但我有点,怎么说呢,在翻译中迷失了方向。我真的很喜欢你的评论我不能做得更好
    • 感谢您阐明第二个参数的目的;一粒种子。这就是我一直在寻找的答案。
    【解决方案2】:

    0 参数函数有一个空参数列表。

    def random_seed():  # Zero arguments here.
      return MY_CONFIG.predictble_random_seed  # Some imaginary config.
    
    random.shuffle(some_list, random_seed)  # Always the same shuffling.
    

    这种安排的重点是允许控制洗牌的可预测性。您可以在生产环境中返回一个真正的随机数(来自计时器、/dev/urandom 等,如 random.random() 所做的那样),并在测试环境中返回一个受控数字:

    def get_random_generator(environment):
      if environment == 'test':
        return lambda: 0.5  # A 0-argument callable returning a constant.
      else:
        return random.random  # A function returning a random number.
    
    # ... 
    
    # The below is predictable when testing in isolation, 
    # unpredictable when running in production.
    # We suppose that `environment` has values like 'test' and 'prod'.
    random.shuffle(entries, get_random_generator(environment))  
    

    【讨论】:

    • 谢谢,@9000。您的最新编辑使像我这样的新手更容易理解。 MY_CONFIG.predictble_random_seed 是一个真正的 Python 函数吗?
    • @Nemo:不,MY_CONFIG.predictble_random_seed 是一个虚构的全局变量,它可能会唤起您配置代码的想法。我会展开并评论它。
    【解决方案3】:

    这意味着您可以传入不需要参数的函数的名称。

    def foo():
        return 0.5
    

    就是这样的功能。

    def bar(limit):
        return limit
    

    不是,因为它需要一个参数limit

    使用示例:

    random.shuffle(itemlist, random=foo)
    

    如果输入 itemlist[1, 2, 3],那么现在将是 [1, 3, 2]。我已经通过实验建立了这一点,我想随机函数的输出究竟如何使用随机函数的输出可能会在 Python 版本之间发生变化。

    如果您不指定任何内容,则默认为函数random()

    一个可能的用例是,如果您想要可预测的输出,例如对于一个测试用例。另一个是如果你想要非均匀分布 - 例如,一个更喜欢小值而不是大值的随机函数,或者实现例如泊松或正态分布。

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多