Java随机交集范围问题:意外结果

3
请考虑以下代码:

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);
    }

我正在生成600次(0-600)范围内的随机整数,天真地期望没有重复。实际结果约为37%。
是否有一种数学公式可以计算交集概率,具有随机整数范围和调用次数?我不想只依靠这个经验值37%进行计算。

由于Java的Random具有均匀分布,您应该期望交集为600中的1个。 - Boschi
2
你为什么期望有0%的交集呢?如果你掷骰子6次,你期望每个数字都只掷一次吗?我会期望某些数字至少掷两次,而有些数字则不会掷到。 - Socowi
1个回答

3
Java的Random.nextInt()保证具有均匀分布,但每次调用它时不保证唯一。因此,交集概率是与生日问题相同类型的计算(https://en.wikipedia.org/wiki/Birthday_problem)。很抱歉我没有完整的公式在脑海里,但可以通过一点研究(甚至自己计算)轻松找到它。编辑2:维基百科页面已经包含了你需要的一切:看看碰撞计数部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接