【发布时间】:2014-09-25 21:34:55
【问题描述】:
这是一个组合算法的implementation,用于随机均匀地选择 n 集的子集。由于一个 n 集有 2n 个子集,每个子集应该有一个概率:2-n 被选中。
我相信我已经正确地实现了算法(如果某处存在错误,请告诉我)。然而,当我在我的 Linux 机器上使用 Java 7 运行程序时,我得到的结果我无法很好地推理。谜团似乎与随机数生成器有关。我知道需要“大量”运行该程序才能“看到分布达到均匀性”。然而,问题是有多大。我确实建议过几次运行,除非实验完成的次数 >= 10 亿,否则所选子集的分布是非常不均匀的。
该算法基于 Herbert Wilf 教授的组合算法书,其中实现(略有不同)是在 Fortran 中完成的,即使程序仅运行 1280 次,分布也或多或少是均匀的。
这里有一些样本运行(当 n 为常数时,运行之间会有一些变化)以获得 4 组的随机子集:
- 实验完成的次数 n = 1280
- 实验完成的次数 n = 12,800
- 实验完成的次数 n = 128,000(仍然只有 8 个子集!)
- 实验完成的次数 n = 1,280,000
- 实验完成的次数 n = 12,800,000(现在开始有意义了)
- 实验完成的次数 n = 1,280,000,000(没关系!)
你会期待这样的表现吗? Wilf 教授如何仅使用等效程序的 1280 次迭代来获得类似的结果?
【问题讨论】:
标签: random probability subset