随机生成一个子集?

时间:2014-09-25 21:34:55

标签: random probability subset

这是一个implementation的组合算法,可以随机均匀地选择n组的子集。由于n-set有2个 n 子集,每个子​​集应该有一个概率:2 -n 被选中。

我相信我已正确实施了算法(如果某处有错误,请告诉我)。然而,当我在Linux机器上运行带有Java 7的程序时,我得到的结果是我无法理解的。神秘似乎在随机数生成器周围。我知道需要大量运行程序才能“看到分布达到一致”。但问题是有多大。几次运行我确实建议,除非实验完成的次数是> = 10亿,否则所选子集的分布是非常不均匀的。

该算法基于Herbert Wilf教授的组合算法书,其中实现(略有不同)在Fortran中完成,即使程序运行仅1280次,分布也或多或少均匀。

以下是一些示例运行(当n为常数时,运行中存在一些差异)以获得4组的随机子集:

  1. 实验完成的次数n = 1280
  2. 实验完成的次数n = 12,800
  3. 实验完成的次数n = 128,000(仅限8个子集!)
  4. 实验完成的次数n = 1,280,000
  5. 实验完成的次数n = 12,800,000(现在开始有意义了)
  6. 实验完成的次数n = 1,280,000,000(这没关系!)
  7. 你会期待这样的表现吗? Wilf教授如何才能通过 1280 迭代的等效程序获得类似的结果?

1 个答案:

答案 0 :(得分:3)

每次拨打ranInt()时,都会重置RNG。因此,从长远来看,这些数字不再是随机的。
已将Random r = new Random(System.currentTimeMillis());移至顶部并向其添加static

class RandomSubsetSimulation {
  static Random r = new Random(System.currentTimeMillis());
  public static void main(String[] args) { ...

我可以使用8组

获得以下结果
Total: 1000, number of subsets with a frequency > 0: 256
Total # of subsets possible: 256

4组

的完整结果
Frequencies of chosen subsets ....
                 [3] :         76,          4, 5.94
                 [4] :         72,          8, 5.63
                  [] :         83,         -3, 6.48
                 [1] :         90,        -10, 7.03
                 [2] :         80,          0, 6.25
              [3, 4] :         86,         -6, 6.72
              [2, 3] :         88,         -8, 6.88
              [2, 4] :         55,         25, 4.30
           [1, 2, 3] :         99,        -19, 7.73
           [1, 2, 4] :         75,          5, 5.86
           [2, 3, 4] :         76,          4, 5.94
              [1, 3] :         85,         -5, 6.64
              [1, 2] :         94,        -14, 7.34
              [1, 4] :         72,          8, 5.63
        [1, 2, 3, 4] :         71,          9, 5.55
           [1, 3, 4] :         78,          2, 6.09
Total: 1280, number of subsets with a frequency > 0: 16
Total # of subsets possible: 16