Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
324 views
in Technique[技术] by (71.8m points)

一个数M,分成N份,最小是minv,每份数值是10的整数倍。求方法。

    function randomSplit(m,n,minv,maxv){
        var res=[];
        while(n>0){
            l = Math.max(minv,m-(n-1)*maxv);
            r = Math.min(maxv,m-(n-1)*minv);
            num = Math.floor(Math.random() * (l - r)) + r;
            n -= 1;
            m -= num;
            res.push(num);
        }
        console.log(res);
    }    

我搞出来一个,数m,分成n份,每份最小minv,最大maxv。生成的数,不是10的整数倍。
例如: randomSplit(45000,3,10000,20000) ?
[10512, 15316, 19172]

也不是很准确,10512超出了,怎么能改成,每次是10的整数倍。
例如: randomSplit(5000,3,1000,2000)
生成这种:[1550,1660,1790] 3份合计是5000,每个数都是10的倍数,不小于1000。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

除了求和数M,最大最小数皆为10的倍数,随机函数也必须生成10的倍数方可,如下所示

    function randomSplit(m,n,minv,maxv){
        var res=[];
        while(n>0){
            l = Math.max(minv,m-(n-1)*maxv);
            r = Math.min(maxv,m-(n-1)*minv);
            num = Math.floor(Math.random() * (l - r)/10)*10 + r;
            n -= 1;
            m -= num;
            res.push(num);
        }
        console.log(res);
    }    

测试

randomSplit(45000,3,10000,20000) 
(3)?[10770, 14950, 19280]

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...