random.choices() 和 random.sample() 函数有啥区别?

Posted

技术标签:

【中文标题】random.choices() 和 random.sample() 函数有啥区别?【英文标题】: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]

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

【问题讨论】:

【参考方案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)当您在采样数据时无法承受重复数据时,您希望使用它

进一步阅读:

random.choices random.sample

【讨论】:

以上是关于random.choices() 和 random.sample() 函数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

random模块

基本编程题 --python

python3学习之random

python随机模块random的22种函数

2018.10.16python学习第二十天

随机整数函数