2012-02-25 95 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,顺便说一句。

感谢

+1

'(最大 - 最小)/ 2'这不是中位数。 – CodesInChaos 2012-02-25 19:37:26

+0

@CodeInChaos:thx,纠正它。 – 2012-02-25 19:38:55

回答

8

[试图在这里覆盖范围,因为它不是我清楚你不理解什么]

第一,中位数是中间值。 [0,0,1,99,99]的中位数是1.

所以我们可以看到给出的代码并没有计算中位数(它没有找到中间值)。相反,它从估计它从一些理论分布。正如评论所说。

您提供的论坛是针对中点的。如果许多值均匀分布在最小值和最大值之间,那么是的,这是对中值的一个很好的估计。在这种情况下(大概)值不是以这种方式分配的,所以其他一些方法是必要的。

您可以通过计算上述数字的中点来了解为什么这可能是必要的 - 您的公式将给出49.5。

使用估计值的原因可能是它比找到中位数要快得多。做出这个估计的原因随机很可能会避免在多次通话中出现坏的最坏情况。

最后,抱歉,但我不知道在这种情况下的分布是什么。您可能需要搜索数据结构和/或作者姓名,以查看是否可以找到论文或书籍参考(我认为它可能假定了幂律,但请参阅下面的编辑 - 它似乎正在添加一个非常小的更正)(我不确定这是你问的问题,还是你更一般的困惑)。

寻找更多,我认为日志(...)是一致的随机t给中央偏见。所以它基本上按照你的建议来做,但是有一些传播在0.5左右。这里有一个plot of one case这表明retval实际上是一个非常小的调整。

+0

除此代码不依赖'n' ... – 2012-02-25 19:43:55

+0

呵呵。你是对的。我会放弃的。抱歉。 – 2012-02-25 19:45:31

+0

哦,对不起,只是现在我意识到我忘了在原文中提到了源文件。从它的外观来看,我会说我想要在空间上统一分布点数:http://pdfcast.org/pdf/karp。 – 2012-02-25 19:47:43

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除的原因。 – 2012-02-25 21:42:07

相关问题