python如何随机组合词语_在Python中随机选择所有组合的子集

当n很小时,我可以构造一个n长度二进制值的所有组合列表itertools.list(product([0,1],repeat = n)).

1000

0100

0110

1001

.

.

.

当n很大时,如何在不首先构建大量组合列表的情况下随机选择上面列表的子集?

假设当n = 30时,我想随机挑选100万个无需替换的组合(总共2 ^ 30个组合)

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到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

标签:python,random,combinations,itertools

来源: https://codeday.me/bug/20190527/1162137.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值