2012-02-25 11 views
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、btwで見つけることができます。

おかげ

+1

'(max - min)/ 2'これは中央値ではありません。 – CodesInChaos

+0

@CodeInChaos:thx、それを修正しました。 –

答えて

8

最初に[それはあなたが理解していないものを私にはっきりしていないので、ここでの範囲をカバーしようとしている]、中央値は真ん中値です。 [0,0,1,99,99]の中央値は1です。

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

あなたが与えるforumlaは中間点です。多くの値がminとmaxの間に均一に分布している場合、それは中央値の良い推定値です。この場合(おそらく)値はそのようには分散されないので、他の方法も必要です。

あなたは、上記の数字の中間点を計算することによって、なぜこれが必要なのかを知ることができます。数式は49.5になります。

推定値を使用する理由は、中央値を見つけるよりもはるかに高速である可能性があります。その推定値をランダムにとする理由は、複数のコールで悪い最悪の場合を避けるためです。

最後に申し訳ありませんが、この場合の配信が何であるか分かりません。おそらく、データ構造や著者名を検索して、紙や書籍のリファレンスを見つけることができるかどうかを調べる必要があるでしょう(私はそれが強行法を前提としていると思っていましたが、以下の編集を参照してください - )(あなたが求めているものか、もっと一般的に混乱しているのか分かりません)。

[編集]もっと見ると、ログ(...)は一様にランダムなtに中心的なバイアスを与えていると思います。基本的にはあなたの提案をしていますが、0.5を中心に広がっています。ここにはplot of one caseがあり、実際にはかなり小さい調整であることがわかります。retvalです。

+0

このコードが 'n'に依存しないことを除いて... –

+0

huh。あなたが正しい。私はそれを落とします。ごめんなさい。 –

+0

ああ、申し訳ありませんが、今私は、元の投稿にソース・ペーパーへの参照を入れるのを忘れてしまったことに気付きました。見た目からは、宇宙上の点の均一な分布が望まれます:http://pdfcast.org/pdf/karp。 –

4

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

しかし、見た目からは、単純に指数関数的に分布したランダム値が[min,max]の範囲で生成されています。 http://en.wikipedia.org/wiki/Exponential_distribution#Generating_exponential_variatesを参照してください。


興味深いことに、そのマジックナンバーのためにグーグルでは、のどれが照明されていない、関連するヒットの多くが表示されます:http://www.google.co.uk/search?q=162754.79141900392083592475

+0

'exp(12)'それで、12.0で割り切れる理由です。 –

関連する問題