如何以相同的概率以N种方式排列k项

问题描述 投票:0回答:3

我有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

我无法理解实现这一目标的方法是什么。请告诉我哪种算法适用于此处。

combinations permutation probability
3个回答
1
投票

如果我理解正确,那么这些想法应该适合你:

7! = 5040可能的方式来安排你的元素。在这些5040独特的序列中,有6! = 720在第一个位置有k1720在第一个位置有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++),因此编码将更加高效和简单。

我将保留原来的答案,因为它有助于我(并希望其他人)理解为什么统一的洗牌是正确的解决方案。


1
投票

我的第一次尝试是从列表中取出一个随机元素,然后从随机元素中取出未选择元素的子集,依此类推。对于第二个子集执行相同操作,完成后,检查它是否等于第一个子集。由于良好随机函数的均匀分布,它应该给你相同的概率


0
投票

你不能,至少不如说明书中所述。如果k_1具有相同的出现在每个位置的概率,那么它在位置1出现的组合的数量将等于它在每个其他位置出现的组合的数量。但这意味着组合的数量必须是7的倍数,而30则不是。

如果您只关心绘制30种组合时的概率,那么随机选择序列是可行的,正如Brueni所说。然而这与30种组合无关,所以我怀疑这是你的意图吗?

© www.soinside.com 2019 - 2024. All rights reserved.