Java 范围内的随机交集:意外结果

Java random intersection in a range: unexpected results

请考虑这段代码:

private static final Random RANDOM = new Random();

    public static void main(String[] args) {

        long distinct = IntStream.range(0, 600)
                .map(i -> RANDOM.nextInt(600))
                .distinct()
                .count();

        System.out.println("intersection %:" + (double) (600 - distinct) / 600 * 100);
    }

我正在生成一个范围为 (0-600) 600 次的随机整数,天真地期望有 0% 的交集。实际结果约为 37%。

是否有计算交叉概率的数学公式,具有随机整数范围和调用次数?我真的不喜欢在我的计算中相信这个经验值 37%

Java的Random.nextInt()保证均匀分布,不会每次调用都是唯一的

因此,相交概率与生日问题(https://en.wikipedia.org/wiki/Birthday_problem)是同一种计算。很抱歉,我脑子里没有完整的公式,但通过一些研究(甚至自己计算)可能很容易找到它。

编辑2:

维基百科页面已包含您需要的一切: 查看零件碰撞计数。