如何以等概率以N种方式排列k个项目

时间:2019-04-23 13:27:27

标签: combinations permutation probability

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

我无法理解实现此目标的方法。请让我知道哪种算法可以在这里工作。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果我对您的理解正确,那么这些想法应该对您有用:

7! = 5040种可能的方式来布置元素。 在这些5040唯一序列中,有6! = 720个在第一个位置具有k1720在第一个位置具有k2,... ,720的{​​{1}}位于最后一个位置,等等。 因此,如果您从这些k1序列中随机抽取30,我认为结果应该符合您的要求。

如何绘制它们?好吧,这取决于您使用的编程语言。在C ++中,有next_permutation。在python中有itertools.permutations。这些功能将按字典顺序遍历所有5040可能的安排。其他语言可能会提供类似的工具。

然后,您可以在7!中随机生成一个数字n,并在初始范围内调用[0, ..., 5040[ next_permutation次(或在python中,将迭代器{{ 1}}次。重复30次。 但是请注意,对于更大的数量,这很快就会变得效率很低,不确定您对效率的需求是什么。

更新

我对解决方案的思考越深,我越意识到如何绘制它们?可以得到更好的回答:

您只需要一个uniform shuffle algorithm。根据定义,这将统一生成n排列之一,这正是我最初的答案所做的,但是由于大多数语言都提供了这种改组算法(例如{{3} }。

我将保留原来的答案,因为它可以帮助我(并希望其他人)理解为什么在这里进行统一洗牌是正确的解决方案。

答案 2 :(得分:0)

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

如果您只关心绘制30种组合时的概率,那么按照Brueni的建议,随机选择序列是可行的方法。但是,这与30种组合无关,所以我怀疑这是您想要的吗?