请考虑这段代码:
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:
维基百科页面已经包含了您需要的一切: 查看零件碰撞计数。
关于: unexpected results 范围内的 Java 随机交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43390165/