我有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
我无法理解实现此目标的方法。请让我知道哪种算法可以在这里工作。
答案 0 :(得分:1)
我的第一个尝试是从列表中删除一个随机元素,然后从未选择的元素的子集中获取一个随机元素,依此类推。对于第二个子集,请执行相同的操作,并在完成后检查其是否等于第一个子集。由于良好随机函数的均匀分布,它应该给您相等的概率
答案 1 :(得分:1)
如果我对您的理解正确,那么这些想法应该对您有用:
有7! = 5040
种可能的方式来布置元素。
在这些5040
唯一序列中,有6! = 720
个在第一个位置具有k1
,720
在第一个位置具有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种组合无关,所以我怀疑这是您想要的吗?