これらのうちどれが正確に50%の確率を与えるのか(ランダム値が0と1の間の浮動小数点数である場合(AS3やJavaScriptのMath.random()
など) )?私はそれらの両方が実際に使用されるのを見ました:
if (Math.random() > 0.5) ...
if (Math.random() >= 0.5) ...
ヘッズアップ:実際には0.5
を正確に打つことは天文学的に低いため、私はここで頭を悩ませています。ただし、0 inclusive
と1 exclusive
の中間がどこにあるかについては、まだ知りたいです。
数学的に言えば、間隔[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とは明らかに無視できるほど異なりますが、まったく同じです。