python:从2D网格中取代而无需替换

时间:2011-01-31 06:36:08

标签: python algorithm random python-3.x

我需要一个样本,无需替换,来自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。

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]

<击>

看评论。睡不够......