我写了一段简单的代码来比较随机数组的差异,发现了一些我不太了解的东西。
我希望结果是接近0.5的随机数,但实际上是0.3333。
为什么随机数数组位于0.3而不是0.5上?
const result = document.getElementById('result');
const generateRandomNrArray = (nrNumbers) => {
let i;
let result = [];
for (i = 0; i < nrNumbers; i++) {
result.push(Math.random());
}
return result;
}
const getArrayDiff = (arr1, arr2) => {
var diff = 0;
arr1.forEach(function (v1, index) {
diff += Math.abs(v1 - arr2[index]);
});
return diff;
}
const run = (nr) => {
const arr1 = generateRandomNrArray(nr);
const arr2 = generateRandomNrArray(nr);
const totalDiff = getArrayDiff(arr1, arr2);
result.innerHTML = "Average difference:" + (totalDiff / nr);
}
button {font-size: 2em;}
<div id="result"></div>
<button id="run" onclick="run(1500)">Click Me</button>
答案 0 :(得分:29)
这基本上可以归结为一个极限,这是有道理的。考虑一下0到10之间的数字组合,并计算可以产生的各种差异。
例如,存在一种组合,两者相差9 —(0,9)。一共有5个,相差5:
[0, 5],
[1, 6],
[2, 7],
[3, 8],
[4, 9]
但是有九种组合,它们之间的差异为1:
[1, 2],
[2, 3],
...
[8, 9]
0-10的计数是:
{1: 9, 2: 8, 3: 7, 4: 6, 5: 5, 6: 4, 7: 3, 8: 2, 9: 1}
有45种组合,并且这些组合的平均差异为3.6666
而不是5
,因为差异要大得多。
将粒度从0-10增加到0-100时,将保持相同的模式。对于平均33.6666
,有99个组合产生的差为1,只有50个产生的差为50。
当您在相反的方向上增加有效位数时,在相反的方向上用0和1之间的细度进行越来越精细的划分,您会发现与极限接近1/3
的过程相同。将平均差异拉低的差异要比较大的差异小得多。对于0-1
,每隔0.1个间隔,您会看到9个相差0.1,而5个相差0.5,在0.01时会有99个相差0.01,而50个相差0.5。随着间隔接近0,差的平均值接近1/3
。
答案 1 :(得分:22)
(事实上,您不是在看差异,而是看您的随机数之间的绝对差异。两者之间存在差异。(请原谅双关语))
如果您有两个独立的均匀分布的随机变量X, Y ~ U[0,1]
,则它们的绝对差|X-Y|
将跟随triangular distribution,其期望值为1/3。一切都应有。这种分布结果以及计算期望值,是概率论中相当标准的作业问题。直觉紧随Mark's argument之后。
以下是绝对和非绝对差的直方图。在左侧,您会看到较小的绝对差值会有更多的质量,从而将期望值拉低了。
R代码:
set.seed(1)
xx <- runif(1e5)
yy <- runif(1e5)
par(mfrow=c(1,2))
hist(abs(xx-yy),main="|X-Y|",col="grey",xlab="")
hist(xx-yy,main="X-Y",col="grey",xlab="")
(顺便说一下,如果您有概率/统计问题,我们的姊妹网站CrossValidated是一个很好的资源。)
答案 2 :(得分:4)
这里有一个几何论证来说明为什么结果收敛到1/3。
首先,让我们定义f(x,y)= abs(x-y)。我们需要证明的是,对于X和Y是在[0,1]中均匀分布的两个独立随机变量,E(X,Y)= 1/3。
如果我们将函数f可视化为3D,则为正方形[0,1] x [0,1]上的高度场,则f下的体积由两个四面体组成,它们的底是一个半单位正方形,其四面体为高度是单位高。
E(X,Y)是f下的体积。通过金字塔体积公式,两个四面体中的每一个都具有体积a * h / 3,其中a是其基本面积,h是其高度。这意味着每个四面体的体积为1/2 * 1 * 1/3 = 1/6,因此E(X,Y)= 2 * 1/6 = 1/3。
答案 3 :(得分:3)
有一种简单自然的方法可以查看:
如果您有一个间隔,比如说<0.0, 1.0>
,并且从间隔中随机选择一个数字,那么您实际上会将间隔分为<0.0, x>
和<x, 1.0>
两部分。
每个部分的平均大小(许多随机数)将收敛到0.5
。
现在,如果您从间隔中选择两个随机数,则会将间隔分为<0.0, x>
,<x, y>
和<y, 1.0>
(x < y
)三个部分。如果您通过多个随机数计算出每个零件的平均尺寸,它将收敛到1/3
。
两个数字之间的平均差是零件的平均大小。
(最初是评论)
答案 4 :(得分:1)
采用离散变量方法
将间隔[0; 1]细分为N个元素(resp k = 1到N,X
将取值k/N
)。稍后,我们将使N趋于犯规
对于给定的X_k
(其中X
保持值为k/N
),计算平均距离,由给出
avgDistance(k) = sum_{i=1}^k (k-i)/N P(Y=i) + sum_{i=k+1}^n (i-k)/N P(Y=i)
当y 第一项将0和k之间的距离求和 因此 最后 想法是简化总和,例如aN ^ 3 + ...小于N ^ 3的项,因此,当N趋于笨拙时,我们将简单地得到aN ^ 3 /(2N ^ 3)+趋于0 < / p>
因此1/N(k(k+1)/2)
,而第二项将1和N-k之间的距离求和1/N(N-k)(N-k+1)
。
此外,P(Y=i) = 1/N
用于所有i(因为Y
是均匀分布的)avgDistance(k) = 1/N^2 [ k(k+1)/2 + (N-k)(N-k+1)/2 ] = 1/(2N^2) [ 2k^2 + N^2 - 2kN + N ]
avgDistance = sum_{k=1}^N avgDistance(k) P(X=k) = 1/N sum_{k=1}^N avgDistance(k) = 1/(2N^3) sum [ 2k^2 + N^2 - 2kN + N ]
sum 2k^2 = 2(N(N+1)(2N+1))/6 ~ 4N^3/6
sum N^2 = N^3
sum -2kN = -2N(N(N+1)/2 ~= -N^3
a = 4/6
和avgDistance = 1/3