我有7个项目,k1-k7,我想以30种不同的方式安排它们,每个项目以相同的概率出现在每个位置。
k1, k2, k3, k4, k5, k6, k7
k1, k4, k5, k3, k7, k6, k2
.
k6, k2, k7, k1, k5, k4, k3
我无法理解实现这一目标的方法是什么。请告诉我哪种算法适用于此处。
如果我理解正确,那么这些想法应该适合你:
有7! = 5040
可能的方式来安排你的元素。在这些5040
独特的序列中,有6! = 720
在第一个位置有k1
,720
在第一个位置有k2
,...,720
在最后位置有k1
,......等等。所以,如果你从这些30
序列中随机抽取5040
,我认为结果应该符合你的要求。
如何画出来?那么,这取决于您使用的编程语言。在C ++中有next_permutation
。在python中有itertools.permutations
。这些函数将以字典顺序遍历所有7!
可能的排列。其他语言可能提供类似的工具。
然后,你可以在n
中随机生成一个数字[0, ..., 5040[
,并在初始范围内调用next_permutation
n
次数(或者,在python中,推进迭代器n
次数)。重复30次。但是请注意,对于更大的数字,这可能会很快变得非常低效,不能确定您对效率的需求。
我越想到我的解决方案,我就越意识到如何绘制它们?可以回答得更好:
你需要的只是一个uniform shuffle algorithm。根据定义,这将统一生成7!
排列中的一个,这正是我原来的答案所做的,但是由于大多数语言提供了这样的混洗算法(例如C++),因此编码将更加高效和简单。
我将保留原来的答案,因为它有助于我(并希望其他人)理解为什么统一的洗牌是正确的解决方案。
我的第一次尝试是从列表中取出一个随机元素,然后从随机元素中取出未选择元素的子集,依此类推。对于第二个子集执行相同操作,完成后,检查它是否等于第一个子集。由于良好随机函数的均匀分布,它应该给你相同的概率
你不能,至少不如说明书中所述。如果k_1
具有相同的出现在每个位置的概率,那么它在位置1出现的组合的数量将等于它在每个其他位置出现的组合的数量。但这意味着组合的数量必须是7的倍数,而30则不是。
如果您只关心绘制30种组合时的概率,那么随机选择序列是可行的,正如Brueni所说。然而这与30种组合无关,所以我怀疑这是你的意图吗?