【问题标题】:Java random intersection in a range: unexpected results范围内的Java随机交集:意外结果
【发布时间】:2017-09-09 10:50:49
【问题描述】:

请考虑这段代码:

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 具有均匀分布,您应该期望交叉点为 600 分之一。
  • 为什么你期望有 0% 的交集?如果你掷骰子 6 次,你希望每个数字都掷一次吗?我希望一些数字至少滚动两次,而一些数字根本不滚动。

标签: java math random probability


【解决方案1】:

Java 的Random.nextInt() 保证具有均匀分布,而不是每次调用时都是唯一的。

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

EDIT2:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多