Algorithm 选择电源组的随机元素

Algorithm 选择电源组的随机元素,algorithm,math,random,statistics,powerset,Algorithm,Math,Random,Statistics,Powerset,对于我现在正在研究的一个问题,我希望从给定集合的幂集合中选择一个合理一致的随机选择。不幸的是,这直接进入了统计学领域,这是我根本没有研究过的东西(这是我现在进入实际编程领域需要纠正的东西),所以我想通过一些了解它的人来运行我的解决方案 如果给定集合的大小为n,则有(nk)=n/[k!(n-k)!]功率集大小为k的子集和总大小为n的子集表示为从0到n的(nk)与k之和。(也被称为2n,但我认为这在这里没有用。我可能是错的) 因此,我的计划是将[0,1]划分为几个区间: [0, (n 0)/N]

对于我现在正在研究的一个问题,我希望从给定集合的幂集合中选择一个合理一致的随机选择。不幸的是,这直接进入了统计学领域,这是我根本没有研究过的东西(这是我现在进入实际编程领域需要纠正的东西),所以我想通过一些了解它的人来运行我的解决方案

如果给定集合的大小为n,则有(nk)=n/[k!(n-k)!]功率集大小为k的子集和总大小为n的子集表示为从0到n的(nk)与k之和。(也被称为2n,但我认为这在这里没有用。我可能是错的)

因此,我的计划是将[0,1]划分为几个区间:

 [0, (n 0)/N] 

 ((n 0)/N, [(n 0) + (n 1)]/N] 

 ([(n 0) + (n 1)]/N, [(n 0) + (n 1) + (n 2)]/N]

  ... 

 ([N - (n n)]/N, 1]
从算法上讲,区间的构造方法是将前一个区间的最大元素与新区间的最大下界相加(nj)/n以获得最大元素。我希望这是清楚的

然后,我可以通过在[0,1]中选择一个统一的浮点并将其映射到它所属的区间的索引来计算出随机子集中有多少个元素。从那里,我可以选择一个适当大小的随机子集

  • 我很确定(仅从直观的角度来看),我的方案提供了一个关于子集大小的统一选择(相对于子集的总量是统一的,在大小的集合{1,2,…,n}上显然是不统一的)

  • 我正在使用一个库(python的
    random.sample
    )来获取给定大小的子集,因此我相信这将是一致的


  • 所以我的问题是,如果按照我所描述的方式将两者结合在一起,那么随机大小的随机子集的选择是否是一致的。如果答案是大量的工作,那么我很乐意接受关于如何证明这一点的建议,并为自己做这项工作。还有,如果有更好的方法,我当然会很高兴的。

    我想你已经走了很长的路了。当您提到电源组的大小为2n时,您已经接近了。如果要选择一组大小
    n
    的幂集的随机元素,请生成[0,2n]范围内的随机整数,并使用整数的二进制表示从幂集中选择适当的元素


    例如,假设S={a,b,c,d,e}。然后幂集包含25=32个元素。生成一个从0到31的随机数,例如18。18的二进制表示是10010,因此您将选择S的第一个和第四个元素。然后幂集的随机元素是{a,d}.

    依次考虑给定集合中的每个元素,并以1/2的概率决定是否将其包含在结果集中。

    我认真考虑了这个问题。谢谢。这也很好,它的优点是,在C语言中不必处理大于64位的数字。幸运的是,Python和Lisp都为我这样做。这感觉是对的,但就像我说的,我不知道统计数据,所以我无法证明这一点,而格雷格的答案是完全一致的,因为它只是一组大小相等的映射,我们已经有了一个统一的选择。还有一种方式,我错过了2^n的联系。+1这实际上是证明它是一致的,事实上是exa与格雷戈的方法一样,考虑星际蓝的回答。用相等的概率选择0或1次N次。这将在0和2 ^ n之间创建一个整数N,并且每个可能性都可能因为硬币翻转的公平性而不同。伪随机数生成器的性能,只有一位随机性(这可以通过执行2*rand()/rand_MAX来避免)。