2017-04-13 4 views
3

コードのこの部分を考慮してください:Javaのランダム交差点:予期しない結果

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回(0〜600)の範囲内のランダムな整数を生成しています%交差点。実際の結果は〜37%です。

ランダム確率の範囲と呼び出し回数を持つ交差確率を計算する数式がありますか?私は実際に私の計算でこの経験的な37%を信頼したくはありません

+0

Javaのランダムに一様分布があるので、600で交差が1になるはずです。 – Boschi

+2

なぜ0%の交点があると思いますか?あなたがサイコロを6回転がした場合、各数字を正確に1回転がすと思いますか?私はいくつかの数字を少なくとも2回、いくつかの数字をまったく使っていないと予想します。 – Socowi

答えて

3

JavaのRandom.nextInt()は、あなたがそれを呼び出すたびにユニークな分布であることが保証されています。

したがって、交差確率は、誕生日問題(https://en.wikipedia.org/wiki/Birthday_problem)と同じ種類の計算です。申し訳ありませんが、私は頭の上から数式全体を持っていませんが、少しの研究で(または自分自身を計算して)簡単に見つけることができます。

EDIT2:

すでにあなたが必要なものがすべて含まれているウィキペディアのページ:一部の衝突カウントで ルック。

関連する問題