js 如何生成不重复的区间

例如 定义范围 1 至 100

随机生成 20-50 60-80 等等 按照顺序排列 范围不能叠加

类似于这样

随机产生1-100内的范围

[[6,9],[22,62],[40,23],[74,62],[76,97]]
[[4,9],[22,50],[74,50],[76,88]]

1.相邻的进行合并 例如[22,62]和[74,62]
2.交集的部分被剔除 例如[40,23]

最终得出
[[6,9],[22,74],[76,97]]
[[4,9],[22,74],[76,88]]
并计算除剩余部分的值[[0,6],[9,22],[74,76],[97,100]]

阅读 2.3k
3 个回答
function getRange(n = 3,min = 0,max = 100){
    if(max - min < 2*n-1){
        alert('该范围有误,不能产生需要的区间数');
        return false;
    }
    //生成 n 个区间,先生成 2n 个不相等数
    //[min+1 , max]
    let arr = {},i=0;
    while(i < 2*n){
        let random = Math.floor((max - min + 1)*Math.random());
        if(!arr[random]){
            arr[random] = random;
            i++;
        }
    }
    //排序
    arr = Object.values(arr).sort((a,b)=>a-b);
    let ranges = [],ranges_ = [];
    arr.reduce((a,b,i,arr)=>{
        (i%2 == 0?ranges_:ranges).push([a,b])
        return b;
    },min)
    ranges_.push([arr[arr.length-1],max])
        
    return {ranges_,ranges}
}
//生成3个区间,总范围[0,100],区间范围[1,100]
getRange();

这个问题。好像不难吧

var obj = {};
var getRandom = (min = 1, max = 100) => {
    return Math.floor(Math.random()*(max-min+1)+min)
}
for(var i=0,il=getRandom(5,10);i<il;i++){
    obj[getRandom()] = true; 
}
var _i = 0;
for(var i in obj){
    console.log(i)
}

出来的不就是边界值吗?

你的需求还不明确,你的几个到底是几个区间?
最终到底要什么输出?
范围到底是什么范围?取值就是[1,100]?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题