



function com(fun,count=10,totalCount=300)
{
    let pre=1/count
    let arr=new Array(count)
    arr.fill(0)

    for (let index = 0; index < totalCount*count; index++) 
    {
        let rand=fun()
        if(rand<0)continue
        for (let index = 0; index < count; index++) 
        {
            let cur=pre*(index+1)
            if(rand<=cur)
            {
                arr[index]+=1
                break
            }
        }
    }
    
    return arr
}

function rand()
{
    return Math.random()
}

//线性同余
function seededRandom()
{
    // 几乎所有的运行库提供的rand都是采用的LCG
    // 形如：I n+1=aI n+c(mod m)生成的伪随机数序列最大周期m，范围在0到m-1之间。要达到这个最大周期，必须满足：
    // 1.c与m互质
    // 2.a - 1可以被m的所有质因数整除
    // 3.如果m是4的倍数，a - 1也必须是4的倍数
    // 以上三条被称为Hull-Dobell定理。作为一个伪随机数生成器，周期不够大是不好意思给别的算法打招呼的，所以这是要求之一。
    // 因此才有了：a=9301, c = 49297, m = 233280这组参数，以上三条全部满足。

    //LCG有一些严重的缺陷, 例如如果LCG用做N维空间的点坐标, 这些点最多位于m1/n超平面上(Marsaglia定理), 
    //有些场合LCG有很好的应用, 例如内存很紧张的嵌入式中, 电子游戏控制台用的小整数, 使用高位可以胜任.


    let now=Date.now(); 
    if(Math.seedBefore!=now)Math.seed = now; 
    Math.seedBefore=now

    Math.seededRandom = function(max, min) 
    { 
        max = max || 1;
        min = min || 0; 
        Math.seed = (Math.seed * 9301 + 49297) % 233280; 
        var rnd = Math.seed / 233280;
        return min + rnd * (max - min); 
    };

    return Math.seededRandom()
}

let max=0


//均值0.5 标准差0.2
function genSho(mean=0.5,std_dev=0.2)
{
    let funback=randomNormalDistribution()
    let rand= mean+(funback*std_dev);
    
    if(rand>max)
    {
        console.log(rand,funback,mean,std_dev,999)
        max=rand
    }
    return rand
    function randomNormalDistribution()
    {
        var u=0.0, v=0.0, w=0.0, c=0.0;
        do
        {
            //获得两个（-1,1）的独立随机变量
            u=Math.random()*2-1.0;
            v=Math.random()*2-1.0;
            w=u*u+v*v;
        }while(w==0.0||w>=1.0)
        //这里就是 Box-Muller转换
        //c=-1*Math.log(w)/w;
        c=Math.sqrt(-1*Math.log(w)/w);

        return u*c;
        //return (Math.random()*2-1)*c;
        //return c;
    }
}

$M.setInterval
(
    '#all',
    ()=>
    {
        let param={sho:com(genSho),rand:com(rand),seed:com(seededRandom)}
        $M.dispatch('html','content-com-statis-update',param)
    },1000
)





