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

max*_*max 7 python random algorithm 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.

Amb*_*ber 7

根据您选择的这些中的多少,最简单的方法就是跟踪您已经选择的内容(通过a 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]
Run Code Online (Sandbox Code Playgroud)