我需要一个样本,无需替换,来自range(n)
的所有可能的数字元组。也就是说,我有一个(0,0),(0,1),...,(0,n),(1,0),(1,1),...,(1,n)的集合),...,(n,0),(n,1),(n,n),我试图得到这些元素的k个样本。我希望避免明确地构建这个集合。
我知道如果我需要一系列数字而不是数字元组的样本,random.sample(range(n), k)
简单而有效。
当然,我可以显式构建包含所有可能的(n * n = n^2
)元组的列表,然后调用random.sample
。但如果k
远小于n^2
,那可能效率不高。
我不确定Python 2和3中的效率是否与效率相同;我使用Python 3。
答案 0 :(得分:7)
根据您选择的这些中的多少,最简单的方法是跟踪您已经选择的内容(通过set
),然后重新选择,直到您得到的内容为止还没有选择。
另一种选择是使用一些简单的数学:
numbers_in_nxn = random.sample(range(n*n), k) # Use xrange in Python 2.x
tuples_in_nxn = [divmod(x,n) for x in numbers_in_nxn]
答案 1 :(得分:0)
你说:
当然,我可以明确地构建 包含所有可能的列表(n * n = n ^ 2)元组,然后调用 随机抽样。但那可能是 如果k小得多,则效率不高 比n ^ 2。
那么,之后如何构建元组你随机选择了一个?即,如果您可以在随机选择要选择的元组之前构建元组,则可以先进行拾取并稍后构建。
我不明白你的元组应该是什么样的,但这里有一个例子,虽然我发现你的元组长度都相同,但这显示了原理:
而不是这样做:
>>> import random
>>> all_sequences = [range(x) for x in range(10)]
>>> all_sequences
[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7, 8]]
>>> random.sample(all_sequences, 3)
[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6, 7, 8]]
你会这样做:
>>> import random
>>> selection = random.sample(range(10), 3)
>>> [range(x) for a in selection]
[[0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8]]
答案 2 :(得分:-1)
不尝试(手头没有python):
random.shuffle(range(n))[:k]
击> <击> 撞击>
看评论。睡不够......