: unexpected results 范围内的 Java 随机交集

标签 java math random probability

请考虑这段代码:

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/

相关文章:

java - 创建一种方法以从任何自定义对象类型创建 csv 字符串 - 通用

java - 将 Ant 构建器集成到 Eclipse : Error "Variable references empty selection"

swift - 生成散点算法

random - 添加随机数会使它们更随机吗?

java - 在最终类中测试私有(private)方法

java - 即时在 TreeSet 中搜索记录

java - 获取 future 的双周日期

algorithm - 一种根据角色位置缩放游戏世界的算法

c - arc4random_uniform 和 PCG 中的均匀分布

java - 生成 -1 和 1 之间的随机 float 会产生 NaN