random.choices() 和 random.sample() 函数之间有什么区别?

Gan*_*h M 20 python random python-3.x

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

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

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

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

nor*_*ok2 27

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

注意,这里所取代置换)应当被理解为放回放置背面),而不是作为同义词取代的(和取代)。

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

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]
Run Code Online (Sandbox Code Playgroud)

如您所见,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]
Run Code Online (Sandbox Code Playgroud)

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


Uma*_*ava 6

基本区别是:

  • 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']
Run Code Online (Sandbox Code Playgroud)

从上面的示例中您可以看到,在 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):当您在对数据进行采样时无法承受重复项时,您会希望使用此功能。

进一步阅读: