我有40个元素的列表。我试图估计我需要多少次采样此列表才能重现该列表中的所有元素。但是,重要的是我替换拾取的元素。即我可能会选择相同的元素20次。到目前为止,我有以下
import random
l = range(0,40)
seen=[]
x=0
while len(seen)<len(l):
r = random.choice(l)
if r not in seen:
seen.append(r)
x=x+1
print x
然而,这总是回归,它需要40次来完成我想要的。但是,这是因为从未选择过两次单个元素。 最终我会运行这个函数1000次,以了解我需要采样的频率。 一如既往,谢谢
答案 0 :(得分:3)
您只需调整x=x+1
的缩进即可。因为现在你只是增加,如果之前没有看到这个值。
如果您经常使用大量商品,可以使用set
作为seen
变量,因为访问项目为faster in avarage。
l = range(0, 40)
seen = set()
x = 0
while len(seen) < len(l):
r = random.choice(l)
if r not in seen:
seen.add(r)
x = x + 1
print x
答案 1 :(得分:1)
这是一种类似的方法。初始化set
,根据定义,它可能只包含唯一元素(无重复项)。然后继续使用random.choice()
从列表中选择一个元素。您可以将您的设置与原始列表进行比较,直到它们的大小相同,您就不会拥有所有元素。保持计数器以查看它需要多少随机选择。
import random
def sampleValues(l):
counter = 0
values = set()
while len(values) < len(l):
values.add(random.choice(l))
counter += 1
return counter
>>> l = list(range(40))
这个数字会有所不同,蒙特卡洛可以获得一些统计数据
>>> sampleValues(l)
180
>>> sampleValues(l)
334
>>> sampleValues(l)
179