关于JavaScript Math.random()和基本逻辑的问题
我写了一段简单的代码来比较随机数组的差异,并发现了一些东西。。。我不太明白关于JavaScript Math.random()和基本逻辑的问题,javascript,math,random,statistics,Javascript,Math,Random,Statistics,我写了一段简单的代码来比较随机数组的差异,并发现了一些东西。。。我不太明白 我生成了两个随机数填充的数组 把随机数之间的差异加起来 打印出平均差值 我本以为结果是接近0.5的随机数,但实际上是0.3333 为什么随机数数组位于0.3而不是0.5 const result=document.getElementById('result'); const generaterandomnrray=(nrNumbers)=>{ 让我; 让结果=[]; 对于(i=0;i{ var-diff=0; arr
const result=document.getElementById('result');
const generaterandomnrray=(nrNumbers)=>{
让我;
让结果=[];
对于(i=0;i{
var-diff=0;
arr1.forEach(函数(v1,索引){
diff+=Math.abs(v1-arr2[index]);
});
返回差;
}
常量运行=(nr)=>{
const arr1=GeneratorAndMnrArray(nr);
const arr2=GeneratorAndMnrArray(nr);
const totalDiff=getArrayDiff(arr1,arr2);
result.innerHTML=“平均差值:”+(总差值/nr);
}
按钮{字体大小:2em;}
单击我
这基本上可以归结为一个限制,这是有意义的。考虑0到10之间的数字组合,计算你能做的各种差异。< /P>
例如,有一个组合的差值为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时,同样的模式适用。有99种组合会导致差异1,只有50种组合的差异为50,平均值为33.6666
随着有效位数从相反方向增加到相反方向,并在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
将间隔[0;1]细分为N个元素(分别k=1到N,X
将取值k/N
)。稍后我们将使N趋向于infty
对于给定的xk
(其中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)
y1/N(k(k+1)/2)
,而第二项对1和N-k之间的距离求和,所以1/N(N-k)(N-k+1)
。
此外,所有i的P(Y=i)=1/N
(因为Y
是均匀分布的)
因此
最后
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 ]
我们的想法是将总和简化为小于N^3的^3+…项,因此当N趋于infty时,我们将得到趋于0的^3/(2N^3)+项
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
这里有一个几何参数来说明为什么结果会收敛到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。(事实上,你看的不是差异,而是随机数之间的绝对差异。这是有区别的。(请原谅双关语。)
如果有两个独立的均匀分布随机变量X,Y~U[0,1]
,则它们的绝对差|X-Y
将以1/3的期望值跟随a。一切都是应该的。这个分配结果,以及计算期望值,是概率论中相当标准的作业问题。直觉直接跟随
这里是绝对和非绝对差异的直方图。在左侧,您可以看到,对于较小的绝对差,质量是如何增加的,这会降低期望值
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="")
set.seed(1)
xx有一种简单自然的方式来看待这一点:
如果你有一个区间,比如说
,然后你从区间中随机选取一个数字,你将把区间分成两部分
和
。
每个零件的平均尺寸(在许多随机数上)将收敛到0.5
现在,如果从区间中选择两个随机数,则将区间分为三部分
、
和
(x
)。如果在许多随机数上计算每个零件的平均尺寸,它将收敛到1/3
这两个数字之间的平均差就是零件的平均尺寸
(原为评论)Java似乎也给出了结果。也许这有助于解释这种行为?用3个数字再试一次,看看你的平均值是多少。您可能会看到模式,平均差异可能趋于0。你说的是绝对的差异。是的,问题变得更容易理解
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="")