这是一个implementation的组合算法,可以随机均匀地选择n组的子集。由于n-set有2个 n 子集,每个子集应该有一个概率:2 -n 被选中。
我相信我已正确实施了算法(如果某处有错误,请告诉我)。然而,当我在Linux机器上运行带有Java 7的程序时,我得到的结果是我无法理解的。神秘似乎在随机数生成器周围。我知道需要大量运行程序才能“看到分布达到一致”。但问题是有多大。几次运行我确实建议,除非实验完成的次数是> = 10亿,否则所选子集的分布是非常不均匀的。
该算法基于Herbert Wilf教授的组合算法书,其中实现(略有不同)在Fortran中完成,即使程序运行仅1280次,分布也或多或少均匀。
以下是一些示例运行(当n为常数时,运行中存在一些差异)以获得4组的随机子集:
你会期待这样的表现吗? Wilf教授如何才能通过 1280 迭代的等效程序获得类似的结果?
答案 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