选择幂集的随机元素

时间:2010-10-16 05:47:01

标签: algorithm math random statistics powerset

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

如果给定集合的大小为n,则存在大小为k的(nk)= n!/ [k!(nk)!]子集,并且给出了powerset的总大小N作为(nk)的总和k从0到n。 (也作为2 n 但我不认为这在这里有用。我可能显然是 错误。)

所以我的计划是将[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]

在算法上,通过将前一个区间的最大元素作为新区间的最大下限加上(n j)/ N来获得最大元素来构造区间。我希望这很清楚。

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

  1. 我非常肯定(从一个直观的角度来看)我的方案在子集的 size 上提供了统一的选择(相对于子集的总量是统一的。这很明显集合{1,2,..,n}的尺寸不均匀)。

  2. 我正在使用一个库(python的random.sample)来获取给定大小的子集,所以我相信这将是统一的。

  3. 所以我的问题是如果以我描述的方式将两者结合在一起,就可以选择随机大小的随机子集。如果答案很多,那么我很高兴接受关于如何证明这一点并指导我自己的工作的指示。此外,如果有更好的方法,那么我当然会对此感到满意。

2 个答案:

答案 0 :(得分:9)

我认为你要走很长的路要走。当你提到功率组的大小为2 n 时,你就近了。如果要选择一组大小为n的幂集的随机元素,则生成[0,2 n )范围内的随机整数,并使用该二进制表示整数,从功率集中选择适当的元素。

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

答案 1 :(得分:3)

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