2

を計算するだけでなく、この中央値関数を使用する理由は何だろうと思っていましたmin + (max - min) / 2

// used by the random number generator
private static final double  M_E12 = 162754.79141900392083592475;

/**
 * Return an estimate of median of n values distributed in [min,max)
 * @param min the minimum value 
 * @param max the maximum value
 * @param n 
 * @return an estimate of median of n values distributed in [min,max)
 **/
private static double median(double min, double max, int n) 
{
    // get random value in [0.0, 1.0)
    double t = (new Random()).nextDouble();

    double retval;
    if (t > 0.5) {
        retval = java.lang.Math.log(1.0-(2.0*(M_E12-1)*(t-0.5)/M_E12))/12.0;
    } else {
        retval = -java.lang.Math.log(1.0-(2.0*(M_E12-1)*t/M_E12))/12.0;
    }
    // We now have something distributed on (-1.0,1.0)
    retval = (retval+1.0) * (max-min)/2.0;
    retval = retval + min;
    return retval;
}

私のアプローチの唯一の欠点は、おそらくその決定論的な性質でしょう。

コード全体はhttp://www.koders.com/java/fid42BB059926626852A0D146D54F7D66D7D2D5A28D.aspx?s=cdef%3atree#L8にあります。

ありがとう

4

2 に答える 2

8

[あなたが理解していないことがはっきりしないので、ここで範囲をカバーしようとしています]

まず、中央値は中間値です。[0,0,1,99,99] の中央値は 1 です。

したがって、与えられたコードが中央値を計算していないことがわかります (中間値を見つけていません)。代わりに、理論的な分布から推定しています。コメントが言うように。

あなたが与えるフォーラムは中間点のためのものです。多くの値が最小値と最大値の間に均一に分布している場合、はい、それは中央値の適切な推定です。この場合 (おそらく) 値はそのように分散されないため、他の方法が必要です。

上記の数値の中点を計算することで、なぜこれが必要なのかがわかります。式は 49.5 になります。

推定値を使用する理由は、中央値を見つけるよりもはるかに高速であるためです。その見積もりをランダムにする理由は、複数の呼び出しで悪い最悪のケースを回避する可能性があります。

最後に、申し訳ありませんが、この場合のディストリビューションはわかりません。おそらく、データ構造や著者名を検索して、論文や書籍の参照を見つけることができるかどうかを確認する必要があります (べき乗則を想定している可能性があると思いましたが、以下の編集を参照してください - 非常に小さな修正を加えているようです) )(それがあなたが求めているものなのか、それとももっと一般的に混乱しているのかはわかりません)。

[編集] もう少し調べてみると、log(...) が一様ランダム t に中央バイアスを与えていると思います。したがって、基本的にはあなたが提案することを行っていますが、0.5の周りにいくつかの広がりがあります. これは、実際にはかなり小さな調整であることを示す1 つのケースのプロットです。retval

于 2012-02-25T19:35:55.250 に答える
4

このコードが何を達成しようとしているのかはわかりません。n最初は!も使用しません。

しかし、見た目からすると、範囲内である種の指数分布のランダム値を生成しているだけです[min,max]http://en.wikipedia.org/wiki/Exponential_distribution#Generating_exponential_variatesを参照してください。


興味深いことに、そのマジック ナンバーを Google で検索すると、関連するヒットが多数表示されますが、どれも明確なものではありません: http://www.google.co.uk/search?q=162754.79141900392083592475 .

于 2012-02-25T19:35:58.097 に答える