【问题标题】:What is the difference between the random.choices() and random.sample() functions?random.choices() 和 random.sample() 函数有什么区别?
【发布时间】:2020-05-02 23:01:06
【问题描述】:

我有以下列表:list = [1,1,2,2]

应用sample方法(rd.sample(list, 3))后,输出为[1, 1, 2]

应用choices方法(rd.choices(list, 3))后,输出为:[2, 1, 2]

这两种方法有什么区别?什么时候应该优先选择一个?

【问题讨论】:

    标签: python python-3.x random


    【解决方案1】:

    根本区别在于random.choices() 将(最终)在同一位置绘制元素(总是从整个序列中采样,因此,一旦绘制,元素就会被替换 - 替换),而random.sample() 不会(一旦选择了元素,它们就会从总体中移除以进行抽样,因此,一旦绘制元素就不会被替换 - 没有替换)。

    注意这里replaced(replacement)应该理解为placed back(placement back),而不是的同义词em>替换(和替换)。

    为了更好地理解它,让我们考虑以下示例:

    import random
    
    
    random.seed(0)
    
    
    ll = list(range(10))
    
    print(random.sample(ll, 10))
    # [6, 9, 0, 2, 4, 3, 5, 1, 8, 7]
    
    print(random.choices(ll, k=10))
    # [5, 9, 5, 2, 7, 6, 2, 9, 9, 8]
    

    如您所见,random.sample() 不会产生重复元素,而 random.choices() 会。

    在您的示例中,这两种方法都有重复值,因为您在原始序列中有重复值,但是在 random.sample() 的情况下,这些重复值必须来自原始输入的不同位置。

    最终,sample() 不能超过输入序列的大小,而 choices() 则不是问题:

    # print(random.sample(ll, 20))
    # ValueError: Sample larger than population or is negative
    
    
    print(random.choices(ll, k=20))
    # [9, 3, 7, 8, 6, 4, 1, 4, 6, 9, 9, 4, 8, 2, 8, 5, 0, 7, 3, 8]
    

    有关采样过程的更一般性和理论性的讨论可以在 Wikipedia 上找到。

    【讨论】:

      【解决方案2】:

      基本区别是这样的:

      • 如果您想从列表中选择多个随机项目而不包括重复项,请使用random.sample 函数。
      • 当您想从列表中选择多个项目(包括重复项)时,请使用random.choices 函数。

      这里有两个例子来说明区别:

      import random
      
      alpha_list=['Batman', 'Flash', 'Wonder Woman','Cyborg', 'Superman']
      
      choices=random.choices(alpha_list,k=7)
      print(choices)
      
      sample= random.sample(alpha_list,k=3)
      print(sample)
      
      Output: ['Cyborg', 'Cyborg', 'Wonder Woman', 'Flash', 'Wonder Woman', 'Flash', 'Batman']
      ['Superman', 'Flash', 'Batman']
      

      从上面的例子你可以看到,在 random.choices() 中你可以传递 'k' 大于你的序列长度,因为 random.choices() 允许重复 .

      然而,如果你在 random.sample() 中传递一个大于序列长度的 'k' 值,你会得到一个错误:

      样本大于总体或为负数。

      现在,来看看用例:

      • random.choices(sequence, weights=None, cum_weights=None, k=1)当您可以负担得起重复抽样时,您想使用它。这就是为什么我们可以给出 k > len(dataset) 的值。
      • random.sample(sequence, k)当您在采样数据时无法承受重复数据时,您希望使用它

      进一步阅读:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-25
        • 2020-11-27
        • 2021-10-24
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 2020-05-11
        • 2016-07-06
        相关资源
        最近更新 更多