dev*_*ium 2 java random algorithm median
我想知道使用这个中值函数的原因是什么,而不仅仅是计算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;
}
Run Code Online (Sandbox Code Playgroud)
我的方法唯一的缺点可能是它的确定性,我会说?
整个代码可以在这里找到,http://www.koders.com/java/fid42BB059926626852A0D146D54F7D66D7D2D5A28D.aspx?s=cdef%3atree#L8,顺便说一句.
谢谢
[试图覆盖范围,因为我不清楚你不理解的是什么]
首先,中位数是中间值.中位数[0,0,1,99,99]为1.
所以我们可以看到给出的代码不是计算中位数(它没有找到中间值).相反,它是从一些理论分布估计它.正如评论所说.
你给的论坛是中点.如果许多值在min和max之间均匀分布,那么是,这是对中位数的良好估计.在这种情况下(可能),这些值不是以这种方式分配的,因此需要一些其他方法.
你可以通过计算上面数字的中点来看出为什么这可能是必要的 - 你的公式会给出49.5.
使用估计的原因可能是它比找到中位数要快得多.使该估计随机的原因可能是避免多次呼叫的坏情况.
最后,抱歉,但我不知道在这种情况下分发是什么.您可能需要搜索数据结构和/或作者姓名以查看是否可以找到纸质或书籍参考(我认为它可能是假定幂律,但请参阅下面的编辑 - 它似乎是添加了一个非常小的修正)(我不确定这是你问的问题,还是你更普遍的困惑).
[编辑]看一些,我认为log(...)给予均匀随机t的中心偏差.所以它基本上按照你的建议行事,但有一些在0.5左右.这是一个案例的情节,表明这retval实际上是一个非常小的调整.
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |