0

0から3の範囲の乱数が必要で、それがどのように機能するかを確認するために次のコードを試しました。

int[] count = new int[4];

    for (int i = 0; i < 1000; i++) {
        int t = (int)(Math.round((Math.random() *3)));

        count[t] +=1;

    }


    for (int i = 0; i < count.length; i++) {
        System.out.println(count[i]);

    }

今の奇妙なことは、0と3が1と2のヒットの約半分のヒットであるということです、それはどのように可能ですか?

4

4 に答える 4

6

各整数に丸められる間隔を見てください。

|----+----|----+----|----+----|
0         1         2         3

<...>
Rounds to 0
     <........>
     Rounds to 1
               <........>
               Rounds to 2
                         <....>
                         Rounds to 3

0と3に丸める範囲は、他の範囲の半分のサイズであることがわかります。したがって、均一に選択すると、半分の頻度でヒットします。

于 2013-03-10T04:42:59.423 に答える
2

http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#round(double)

引数に最も近いlongを返します。結果は、1/2を加算し、結果の下限を取り、結果をlong型にキャストすることにより、整数に丸められます。

サイズが異なるバケットを作成しています。

0-0.4999 ... => 0(.5)

0.5-1.499 ... => 1(1)

1.5-2.499 ... => 2(1)

2.5-2.99999 ... => 3(.5)

修正するには、次のいずれかを使用します。

Random.nextInt(4);

えーと...タイプミス、ありがとう@TedHopp-つまり:

Random r = new Random();
...
r.nextInt(4);

またはします

(int) (Math.random() * 4);s

どちらがあなたが期待することをするでしょう。

于 2013-03-10T04:45:18.633 に答える
1

これは、丸めているために発生します。0は、0.5未満の場合にのみ丸めることができます。ただし、0.5から1.5の間であれば、1を選択できます。したがって、発生する可能性が2倍になります。同じことが2でも起こり、1.5から2.5の間です。そして、3は2.5から3までです。

于 2013-03-10T04:42:18.857 に答える
1
class Math {
    ...
    public static long round(double a) {
       return (long)floor(a + 0.5d);
    }
    ...
}

1と2をヒットする可能性が高くなります

int t = (int)(Math.ceil((Math.random() * 4))) - 1;

ラウンドの代わりにceilを使用すると、より良い分布が得られます。

250
239
242
269
于 2013-03-10T06:30:49.107 に答える