当n很小时,我可以构造n长度二进制值itertools.list(product([0, 1], repeat=n))
的所有组合的列表。
1000
0100
0110
1001
.
.
.
当n很大时,如何在不首先构建大量组合列表的情况下随机选择上面列表的子集?
假设我想在n = 30(总共2 ^ 30个组合)时随机挑选100万个无需替换的组合
我查看了itertools http://docs.python.org/2/library/itertools.html#recipes
中的扩展函数def random_product(*args, **kwds):
"Random selection from itertools.product(*args, **kwds)"
pools = map(tuple, args) * kwds.get('repeat', 1)
return tuple(random.choice(pool) for pool in pools)
但它一次只返回一次。在获得100万个独特组合之前,我应该循环使用此功能吗?或者有更好的方法。谢谢!
答案 0 :(得分:6)
你可以用另一种方式思考问题。基本上,您只需要0
和2^30
之间的100万个随机值。
import random
num_selections = 1000000
range = 2 ** 30
def make_set(n, max):
result = set()
while(len(result) < n):
rand = bin(random.randrange(max)) # converting to binary
result.add(rand)
return result
s = make_set(num_selections, range)
这在我的机器上运行大约2秒钟。如果n
大致等于max
,则此方法效率不高。但是1000000 / (2^30) ~= 0.000931
,所以它运作正常。
编辑:
@ user2285236的解决方案更简洁:
import random
random_group = random.sample(range(2**30), 10**6)
random_group = [bin(x) for x in random_group] # convert all to binary