【问题标题】:Generating a subset uniformly at random?随机均匀地生成一个子集?
【发布时间】:2014-09-25 21:34:55
【问题描述】:

这是一个组合算法的implementation,用于随机均匀地选择 n 集的子集。由于一个 n 集有 2n 个子集,每个子​​集应该有一个概率: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(没关系!)

你会期待这样的表现吗? Wilf 教授如何仅使用等效程序的 1280 次迭代来获得类似的结果?

【问题讨论】:

    标签: random probability subset


    【解决方案1】:

    每次拨打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-set 得到以下结果

    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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多