2017-04-13 47 views
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); 
    } 

我的范围(0-600)600倍生成随机INT,天真地期待有0 %交集。实际结果是〜37%。

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

+0

由于Java的Random具有均匀的分布,所以您应该预计交点在600中为1。 – Boschi

+2

为什么你期望有0%的交集?如果你掷骰子6次,你是否期望每次掷出一次?我希望至少推出一些数字两次,有些数字根本没有。 – Socowi

回答

3

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

因此,交点概率与生日问题(https://en.wikipedia.org/wiki/Birthday_problem)相同。我很抱歉,我没有从头到尾的整个公式,但可以通过一些研究(甚至计算自己)轻松找到。

EDIT2:

已经包含了你所需要的一切的维基百科页面: 看那部分碰撞计数。