web-dev-qa-db-ja.com

どのようにして正確に50%のオッズを得るのですか?

これらのうちどれが正確に50%の確率を与えるのか(ランダム値が0と1の間の浮動小数点数である場合(AS3やJavaScriptのMath.random()など) )?私はそれらの両方が実際に使用されるのを見ました:

if (Math.random() > 0.5) ...
if (Math.random() >= 0.5) ...

ヘッズアップ:実際には0.5を正確に打つことは天文学的に低いため、私はここで頭を悩ませています。ただし、0 inclusive1 exclusiveの中間がどこにあるかについては、まだ知りたいです。

24
IQAndreas

数学的に言えば、間隔[0,1)[を「包括的」として使用し、)を排他的として使用)を正確な50-50の比率で分割するためのテストでは、次のような比較を使用します。

if (Math.random() >= 0.5) ...

これは、初期間隔[0,1)を2つの等しい間隔[0,0.5)[0.5,1)に分割するためです。

比較すると、テスト

if (Math.random() > 0.5) ...

間隔を[0,0.5](0.5,1)に分割します。これらは同じ長さですが、1つ目は境界を含み、2つ目は境界を含みません。

境界が両方のテストで同じように含まれているかどうかは、精度が無限に近づくにつれて制限では問題になりませんが、すべての有限精度では、わずかですが測定可能な違いが生じます。

精度の制限が0.000001(10進数)であるとすると、>=0.5テストは正確に[0,0.499999][0.5,0.999999]を持ち、最初の間隔に0.5を追加することがわかります(または2番目からそれを引くと、2つの間隔が完全に揃います。一方、この精度の下では、>0.5テストは、間隔[0,0.5][0.500001,0.999999]を作成します。これらは、数値<=0.5のために明らかに等しくありません。実際、比率は500001:499999であり、50:50とは明らかに無視できるほど異なりますが、まったく同じです。

41
abiessu