【问题标题】:How to arrange k items in N ways with equal probability如何以 N 种方式以等概率排列 k 个项目
【发布时间】:2019-04-23 13:27:26
【问题描述】:

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


    【解决方案1】:

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

    7! = 5040 可能的方式来排列您的元素。 在这些5040 唯一序列中,有6! = 720 在第一个位置有k1720 在第一个位置有k2,...,720 在第一个位置有k1最后一个位置,...等等。 所以,如果你从这些5040序列中随机抽取30,我认为结果应该符合你的要求。

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

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

    更新

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

    您只需要uniform shuffle algorithm。根据定义,这将统一生成7! 排列之一,这正是我的原始答案所做的,但是由于大多数语言都提供这样的随机算法(例如C++),因此它的编码效率更高且更简单。

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

    【讨论】:

    • 谢谢,这就是我要找的 :-)
    • @RudreshaParameshappa 很高兴听到这个消息 :) 请阅读我的更新
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      如果您只关心绘制 30 种组合时的概率,那么正如 Brueni 所建议的那样,随机选择序列就是要走的路。但这与有 30 种组合无关,所以我怀疑这是否是您的意图?

      【讨论】:

      • 有两种不同的方式来看待这个问题:如果你有 10 个数字并且你不知道它们的值,你只知道它们是通过滚动“创建”的一个骰子,那么您仍然知道从 1 到 6 的每个数字在每个位置出现的概率相同(1/6)(即使 10 不是 6 的倍数),因为您知道每个位置的骰子已经滚动。但是,如果您另外知道掷出 3 个骰子,情况就会改变。那么,在某个位置出现一个的概率当然是3/10
      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多