2

私は現在、4つの値のいずれかになる乱数を生成する必要がある演習に取り組んでいます。(Math.random() の使用のみが許可されていることに注意してください)

0 1 2 または 3

現在、私はこれを使用しています:randno = (int) (Math.random()*4); // range 0-3

ただし、結果の確率は等しい必要があります。これまでの私のテストでは (方法は不足していますが)、3 は他の数字よりもはるかに少ないことが示されています。

これは偶然ですか?または、私のジェネレーターは等しい確率を持っていませんか?

ありがとう!

4

3 に答える 3

1

比較するために、私はあなたのアプローチをこれの隣に置きまし.

public class Test {
    private static int min = 0;
    private static int max = 3;
    private static Map<Integer, Integer> count = new HashMap<>();

    public static void main(String[] args) {
        OptionOne();

        System.out.println("Option One: ");
        for (Entry<Integer, Integer> entry : count.entrySet()) {
            System.out.println(entry.getKey() + "\t " + entry.getValue());
        }

        count = new HashMap<Integer, Integer>();
        OptionTwo();
        System.out.println("\nOption Two:");
        for (Entry<Integer, Integer> entry : count.entrySet()) {
            System.out.println(entry.getKey() + "\t " + entry.getValue());
        }
    }

    private static void OptionOne() {
        for (int i = 0; i < 800000; i++) {
            int number = min + (int) (Math.random() * ((max - min) + 1));
            if (count.containsKey(number)) {
                int sofar = count.get(number) + 1;
                count.put(number, sofar);
            } else {
                count.put(number, 1);
            }
        }
    }

    private static void OptionTwo() {
        for (int i = 0; i < 800000; i++) {
            int number = (int) (Math.random() * 4);
            if (count.containsKey(number)) {
                int sofar = count.get(number) + 1;
                count.put(number, sofar);
            } else {
                count.put(number, 1);
            }
        }
    }

出力:

オプション 1:
0 199853
1 200118
2 200136
3 199893

オプション 2:
0 199857
1 200214
2 199488
3 200441

結論:あなたの方法はうまくいきます。多分あなたのサンプルサイズは十分ではありませんでしたか?

于 2013-10-19T12:42:55.657 に答える