关于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

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

  • 我生成了两个随机数填充的数组
  • 把随机数之间的差异加起来
  • 打印出平均差值
  • 我本以为结果是接近0.5的随机数,但实际上是0.3333

    为什么随机数数组位于0.3而不是0.5

    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)
    
    y 第一项对0和k之间的距离求和,所以
    1/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="")