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

Rai*_*mer 32 javascript random math 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);
}
Run Code Online (Sandbox Code Playgroud)
button {font-size: 2em;}
Run Code Online (Sandbox Code Playgroud)
<div id="result"></div>
<button id="run" onclick="run(1500)">Click Me</button>
Run Code Online (Sandbox Code Playgroud)

Mar*_*yer 29

这基本上可以归结为一个极限,这是有道理的。考虑0到10之间的数字组合,并计算可以产生的各种差异。

例如,存在一种组合,其相差9-(0,9)。有5个,相差5:

[0, 5],  
[1, 6], 
[2, 7], 
[3, 8], 
[4, 9]
Run Code Online (Sandbox Code Playgroud)

但是有九种组合,其差为1:

[1, 2], 
[2, 3], 

... 
[8, 9]
Run Code Online (Sandbox Code Playgroud)

使用0-10时,计数为:

{1: 9, 2: 8, 3: 7, 4: 6, 5: 5, 6: 4, 7: 3, 8: 2, 9: 1}
Run Code Online (Sandbox Code Playgroud)

有45个组合,而这些组合的平均差异3.6666并不是5因为差异较小而不是较大的差异。

当您将粒度从0-10增加到0-100时,将保持相同的模式。共有99个组合,结果相差1,只有50个,相差50,平均值为33.6666

当您增加相反方向的有效位数时,在相反的方向上以0和1之间的越来越细的划分,您会发现与极限逼近相同的过程1/3。将平均差异拉低的差异要比较大的差异小得多。对于 0-10.1的间隔,您会看到9的差异为0.1,5的差异为0.5,在0.01时,将有99的差异为0.01,而50的差异为0.5。当间隔接近0时,差的平均值接近1/3

  • @RainerPlumer将间隔随机分为两部分时,两部分的平均大小为“ 1/2”。如果您随机选择两个数字,则将间隔分为3个部分,每个部分的平均大小为1/3。这两个数字之间的平均差为1/3。 (16认同)

S. *_*ica 22

(事实上​​,您并不是在看差异,而是在看您的随机数之间的绝对差异。这是有差异的。(对双关语)

如果您有两个独立的均匀分布的随机变量X, Y ~ U[0,1],则它们的绝对差|X-Y|将遵循期望值为1/3 的三角分布。一切都应有。这种分布结果以及计算期望值,是概率论中相当标准的作业问题。直觉直接遵循马克的论点

这是绝对和非绝对差异的直方图。在左侧,您会看到对于较小的绝对差而言如何有更大的质量,从而使期望值下降。

三角形

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="")
Run Code Online (Sandbox Code Playgroud)

(顺便说一下,如果您有概率/统计问题,我们的姐妹网站CrossValidated是一个很好的资源。)