2017-04-13 72 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:

已經包含了你所需要的一切的維基百科頁面: 看那部分碰撞計數。