|
Random\Randomizer::getFloat等確率に選んだ float の値を取得する 説明
public float Random\Randomizer::getFloat(float
$min , float $max , Random\IntervalBoundary $boundary = Random\IntervalBoundary::ClosedOpen)指定した区間に一様に分散した浮動小数点数の中から、等確率に選んだ値を返します。
精度が限られているため、
全ての実数が正確に浮動小数点数として表現できるとは限りません。
数値が正確に表現できない場合、値は表現できるもっとも近い値に丸められます。
さらに浮動小数点数の値は、数直線全体に均等に分布しているわけではありません。
浮動小数点数の値は 2進数の指数を使うので、隣り合うふたつの値の距離は、
それぞれの2のべき乗ごとに2倍になります。
つまり: こうした理由から、例えば2つの整数を割るなどして、 要求された区間内の任意の数をランダムサンプリングすると、 分布が偏る可能性があります。 必要な丸めを行うと、 浮動小数点数の値によっては別の値より多くの頻度で返されることがあります。 浮動小数点数の値の密度が変わる2のべき乗周辺の値については、特にそれが当てはまります。 Random\Randomizer::getFloat は、 指定した区間内で正確に表現でき、 かつ一様に分散した浮動小数点数の可能な限り大きな集合から、 等確率に値を返すアルゴリズムを実装します。 選択可能な浮動小数点数の間の距離 (ステップサイズ) は、 密度が最も小さい浮動小数点数の間の距離、つまり、 絶対値がより大きな区間境界の浮動小数点数の距離に一致します。 これは、区間が2のべき乗を1つ以上横切る場合、 与えられた区間内で表現可能な浮動小数点数の値がすべて返されるとは限らないということです。 ステップは、絶対値の大きい区間境界から始まります。 これは、ステップを正確に表現可能な浮動小数点数と一致させるためです。 閉区間の境界は、常に選択可能な浮動小数点数の集合に含まれます。 よって、区間のサイズがステップサイズの正確な倍数でなく、 かつ絶対値が小さな方の境界が閉じている場合、 その境界とそれにもっとも近い選択可能な浮動小数点数との間の距離は、 ステップサイズよりも小さくなります。 警告
このメソッドが返す float の値を後処理すると、 値の一様な分布を壊す可能性があります。なぜなら、 数学演算に含まれる中間的な浮動小数点数の値は暗黙のうちに丸められているからです。 指定された区間は、できるだけ望ましい区間と一致させるべきですし、 丸め処理はこのメソッドが選択した値をユーザーに表示させる直前に明示的に実行すべきです。 サンプルの浮動小数点表現を使った、アルゴリズムの説明
アルゴリズムがどのように動作するかの例を示すために、
3ビットの仮数を使用する浮動小数点表現を考えてみましょう。
この表現は、連続する2のべき乗の間で、8つの異なる浮動小数点数を表現することができます。
つまり、
さてここで、
ここで、要求された区間のサイズは
2.5 は選択可能な値に含まれません。
なぜなら、要求された区間の上界が開いているからです。
1.625 は選択可能な値に含まれます。
この値は最も近い値 1.75 との距離が 0.125
であり、以前決定したステップサイズ 0.25 より小さいのですが、
それにも関わらず、含まれます。
その理由は、要求された区間は下側の境界(1.625 )で閉じており、
閉じた境界は常に含まれるからです。
最後に、アルゴリズムは4つの選択可能な値から等確率で値をランダムに選び、それを返します。 2つの整数値を割るやり方ではなぜダメなのか
上の例では、2のべき乗で区切られたそれぞれの区間に、
表現可能な浮動小数点数が8個あります。
ランダムな浮動小数点数を生成するのに、
なぜ2つの整数を割る方法がうまくいかないのかを示すために、
このランダムな浮動小数点の値は、
2.5 が、
開区間であるため除外されるべきなのに、返されてしまう点に注意してください。
また、2.0 と 2.25 が、
他の値に比べて2倍の確率で返されることにも注意しましょう。
パラメータ
戻り値
エラー / 例外
例例1 Random\Randomizer::getFloat の例
上の例の出力は、 たとえば以下のようになります。 Lat: +69.244304 Lng: -53.548951 注意
参考
|