Welcome to 16892 Developer Community-Open, Learning,Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

    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);
        }
        return res;
    }    

我组装了一个,有时候不准确,有时候准。有误差的时候多。

3000 3 1200 1800
[1000, 1050, 960] "=" 3010
这个就误差了10.

3000 3 1200 1800 ?
[660, 1150, 1190] "=" 3000

这个就正好3000.

minv,我取了。 M的40%
maxv,我取了, M的60%

minv是,每份最小值,
maxv是,每份最大值。

有大神吗?帮我看看吧,实在搞不定了。


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

1 Answer

M存在范围

minv*n <= M <= maxv*n

如 3000 3 1200 1800 错误入参
M至少得3600,3000不符合范围要求,自相矛盾,入参错误又未进行参数检测,异常再正常不过。

function randomSplit(m, n, minv, maxv) {
 if (m < minv * n || m > maxv * n) {
     console.log("参数?不合法")
 return
 }

 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)
 return res;
}
// 测试
randomSplit(4000,3,1200,1800)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to 16892 Developer Community-Open, Learning and Share
...