0

乱数ジェネレーターでコイントスをシミュレートしたかったのですが、これが私がしたことです

public class CoinToss
{
    public static void main(String args[])
    {
        int num=(int)(1000*Math.random());
        if(num<500)
            System.out.println("H");
        else
            System.out.println("T");
    }
}

20 回の実行で 16 回の表と 4 回の裏が得られたので、結果はがっかりしました。それはランダムではないようです。それは可能ですが、プログラムが正しいかどうか、一般的な意見が欲しいですか? 私は数学的に何かが欠けていますか?

4

5 に答える 5

1

20回の実行は、それがどの程度ランダムであるかを評価するのに十分なサンプルサイズではありません. このように考えてみてください: 4 回実行して 4 回表が出た場合、「うわー、それはまったくランダムではない」と思うでしょう。しかし、実際には、4 枚のコインを取り、それらを 16 回裏返した場合、少なくとも 1 回は 4 枚すべての表が出るはずです。したがって、実行回数が少なく、表と裏が均等に分かれていない結果が得られたとしても、それはランダムではないという意味ではありません。

または、次のように考えてみましょう。「表」、「裏」、「表」などと出力するだけのコードを書いた場合、正確に半分表と半分裏が得られます。しかし、それはまったくランダムではありません!ただの繰り返しパターンです。

したがって、ランダムな結果が短期間で不均一に見えても、この話の教訓は驚くべきことではありません。表の数と裏の数をカウントするようにコードを書き直し、約 100 万回反転させて、それぞれ約 500,000 を取得しないかどうかを確認してください。ランダムでは正確な値が得られないため、多少多めまたは少なめにする必要がありますが、より近い値にする必要があります。

于 2016-04-29T11:58:15.883 に答える
0

それぞれの数を等しくするには、より多くの入力が必要です。このような少数の出力の場合、数値の点でそれらを互いに近づける場合があり、場合によっては一方の側が他方よりも多く「表示」されることがあります。実際には、4表と裏16が発生する確率0.462%はやや「現実的」です... 実行回数を増やして、それを試してみて、どのように動作するかを確認してください。

ところで、この入力について考えてみてください。

6 6 6 6 6 6 6 6 6 6

ランダムに見えませんよね?πしかし、ある時点で数の小数に存在するため、ランダムなシリーズの一部です。これは級数の大きさの問題なので、乱数を扱うときはそのように考える必要があります。結果よりも乱数発生器について考えてください。System.nanoTime() に基づいているため、正しい関数を使用しているため、ジェネレーターは正しいですが、結果は小さすぎます。

于 2016-04-29T11:57:09.177 に答える