2016-03-23 12 views
0

私は統計のためのシミュレータを作ろうとしています。まず、0から2までの数字を描きたいのですが、それぞれ描画する確率が同じです(つまり、0 = 33.33 %、1 = 33.33%、2 = 33.33%)、コードを実行すると、常に0が描画され、1が66%、cが1%描画されます。Java - 同じ確率を持つ数字を描画する

100万回の抽選では、私は、数値のそれぞれが33%に近づくことを期待しています。

これは、私は、コードのために得たものである:

Random number = new Random(); 
    int sorteio; 
    int a=0; 
    int b=0; 
    int c=0; 
    int n; 


    for (n=0;n<1000000;n++){ 
    sorteio = number.nextInt(3); 

    switch (sorteio){ 
    case 0: 
     a++; 
    case 1: 
     b++; 
    case 2: 
     c++; 
    } 

} 
    System.out.println("a: " + a + " b: " + b + " c: " + c); 
+5

あなたの ':intをインクリメントすると、あなたのswitchにするつもりのすべてのであれば、あなただけの配列を使用する方が良いかもしれません

switch (sorteio) { case 0: a++; break; case 1: b++; break; case 2: c++; break; } 

をswitchステートメントは 'break'sを必要とします。 – bradimus

+4

スイッチにbreakステートメントがありません。 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html – clearlyspam23

+2

私はあなたがcが100%描かれていて、1% – RealSkeptic

答えて

1

あなたswitch文がフォールスルーを防ぐためにbreak文を必要とします。何が起こっている

は0が発生した場合、aがインクリメントされ、その後、何break文が存在しないため、実行はbがインクリメントされ、次caseに「通って落下」、そして最後に実行が再びフォールスルーとcがインクリメントされていることです。

同じ理由で、1が生成された場合は、bcの両方がインクリメントされます。 2が生成された場合は、cのみがインクリメントされます。このため、cは、時間の100%、bの場合は66%、の場合は33%(1が生成されたときにはのみが生成されるため)に増分されます。

switch文がJavaで動作する方法の詳細については、this tutorialを参照してください。

このお試しください:

int[] count = new int[3]; 
for(int i=0; i<1000000; ++i) { 
    count[number.nextInt(3)]++; 
} 

System.out.printf("a: %d, b: %d, c: %d%n", count[0], count[1], count[2]); 
関連する問題