有关JavaScript Math.random()和基本逻辑的问题

时间:2019-06-02 17:02:07

标签: javascript math random statistics

我写了一段简单的代码来比较随机数组的差异,发现了一些我不太了解的东西。

  1. 我生成2个充满随机数的数组
  2. 求和随机数之间的差异
  3. 打印出平均差异

我希望结果是接近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>

5 个答案:

答案 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之后。

以下是绝对和非绝对差的直方图。在左侧,您会看到较小的绝对差值会有更多的质量,从而将期望值拉低了。

triangles

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之间的距离求和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 ]

想法是简化总和,例如aN ^ 3 + ...小于N ^ 3的项,因此,当N趋于笨拙时,我们将简单地得到aN ^ 3 /(2N ^ 3)+趋于0 < / p>

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/6avgDistance = 1/3