我有一个独特的问题。让我们考虑我们有一个元素列表[1,2,3,4,5,6]。我需要根据池大小选择某些元素集来形成池。i、 e.如果池大小为3,而我的列表大小为6,则总共有6C3个可能的组合。这可以通过随机抽样来完成
但是这里有一个问题,假设我有一个更大的列表,我必须对列表中的所有成员进行分组,以便在一次迭代中所有成员都出现在一个组中(我们称之为种子)。 现在,对于下一个种子,我将再次以不同的组合对元素进行分组,但是我得到的组合必须与我在上一个种子中得到的组合是唯一的
例如: 元素为[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] 现在我的泳池是3号 我的种子3
seed1-'[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]'
seed2-'[[1,5,3],[4,2,6],[7,11,9],[10,8,12],[13,17,15],[16,14,18]]'
seed3-'[[1,5,6],[4,2,3],[7,11,12],[10,8,9],[13,17,18],[16,14,15]]'
请注意,所有元素必须在种子中出现一次,并且任何种子中的任何组合都不得重复。对于一小部分元素来说,这看起来很简单,但我正在尝试在一个300个元素和500个种子上实现这一点
如果生成的种子数不接近用尽可能的组合,那么您可以做的是对整个数字列表进行洗牌,然后将其分解为池大小的块。然后跟踪到目前为止使用的池,并在发生冲突时生成另一个洗牌
这可以在生成器函数中完成,这样您就不需要预先确定要生成的种子数:
样本输出:
要从300个项目中生成500个种子,可以使用列表理解(或者可以向生成器函数添加参数)
注意:我假设您不希望任何池在种子之间重复。如果允许池重复,那么您只需要检查
if tuple(seed) in used: continue
来尝试另一次洗牌,当然,在生成唯一种子后,在used
集中记录整个种子而不是单个池:used.add(tuple(seed))
[编辑]以下是调整后的函数,用于将额外值分散到随机池,以便所有池至少具有请求的池大小:
相关问题 更多 >
编程相关推荐