Javascript 生成最小到最大范围内均匀分布的整数列表

Javascript 生成最小到最大范围内均匀分布的整数列表,javascript,math,range,sequence,Javascript,Math,Range,Sequence,我试图获取一个充满数字的列,并使用最小值和最大值生成一个筛选范围列表,供用户筛选表。使用朴素的方法最终会导致难以处理的数字范围,我真的更愿意使用舍入的数字,不管最小值/最大值是多少 我已经在好几个地方看到了这个问题,我认为目前为止我找到的最好的答案是,但我希望有非常圆的步骤 例如,如果我需要生成0-100000之间的4个范围,则数字将为: 0 - 25000 25000 - 50000 50000 - 75000 75000 - 100000 然而,如果我的最小值和最大值都是奇怪的数字

我试图获取一个充满数字的列,并使用最小值和最大值生成一个筛选范围列表,供用户筛选表。使用朴素的方法最终会导致难以处理的数字范围,我真的更愿意使用舍入的数字,不管最小值/最大值是多少

我已经在好几个地方看到了这个问题,我认为目前为止我找到的最好的答案是,但我希望有非常圆的步骤

例如,如果我需要生成0-100000之间的4个范围,则数字将为:

0     - 25000
25000 - 50000
50000 - 75000
75000 - 100000
然而,如果我的最小值和最大值都是奇怪的数字,我可能会很难使用范围

示例:如果需要生成从-1234到4321的5个范围,则范围为:

-1234 - -123
-123  -  988
988   - 2099
2099  - 3210
3210  - 4321
我更喜欢这样的范围:

-1234 - 0          -1234 -  0          -1234 - -100
0     - 1000        0    -  1000       -100  -  1000
1000  - 2100        1000 -  2000        1000 -  2100
2100  - 3200        2000 -  3000        2100 -  3200
3200  - 4321        3000 -  4321        3200 -  4321

或者类似的东西。范围的大小需要彼此接近,但更重要的是数字要易于浏览和使用。

这里有一种方法可以计算覆盖范围所需的最小步长,然后将其截断为10次幂的十分之一(包括步长),然后返回从最小值开始到最大值结束的步长点,中间边界步长距离相隔,外部边界稍高,以包括最小值/最大值

const range=(最小、最大、步长)=>{
//最小步长
步长=(最大-最小)/步长;
//将步长增加到一个好的边界
//例如,包括它的10^n范围的十分之一
pow=Math.trunc(Math.log10(步长))-1;
步长=数学真值(步长/10**pow)*10**pow;
//将最小值取整到同一边界
结果=[min];
最小值=数学真实值(最小值/10**功率)*10**功率;
for(设i=0;i尼克的方法使用“算术级数”公式。这确实是解决这个问题的唯一办法

下面的解决方案考虑了@SpencerD就单个算术级数如何无法获得所需结果所作的评论。这不是一个直线序列,除了增量为1100的“中间”部分

因此,我发布这个答案是为了证明,如果分阶段分解,算术级数仍然是可能的。剩下的解释在代码注释中

函数下限(实际值,边界增量){
//让我们通过算术级数公式确定最小值
返回数学地板(实际值/边界增量)*边界增量
}
函数上限(实际值、边界增量){
//让我们通过算术级数公式确定最大值,因此上限为+1
返回值(数学下限(实际值/边界增量)+1)*边界增量
}
函数范围(最小值、最大值){
设nextMin=min
//现在,让我们使用助手函数根据问题中的“更喜欢的范围”来确定范围
设范围=[];
//如果第一个范围为负,则将该值设置为0
如果(最小值<0){
推送范围([min,0]);
nextMin=0;
}
//第二个量程需要特殊条件,即增量为1000
如果(最大值>下一分钟){
//因此,让我们无条件地这样做
射程.推力([nextMin,上限(nextMin,1000)]);
nextMin=上限(nextMin,1000);
}
//让我们以1100为增量确定是否存在后续范围
如果(下一分钟<最大值){
同时(下一分钟<最大值){
范围.推送([nextMin,上限(nextMin,1100)])
nextMin=上限(nextMin,1100)
}
}
//最后,让我们使用“最大”值来生成(覆盖)最大范围的最大值
范围[ranges.length-1][1]=最大值
返回范围;
}
功能测试(){
log(getRanges(parseInt(document.getElementById(“min”).value)、parseInt(document.getElementById(“max”).value));
}
输入最小值:

输入最大值:

Console.log()
一个“算术级数”将解决这个问题。一个定制函数,它接受一个值并返回您想要的值。可能需要两个功能。一个用于值的下限,一个用于值的上限。我会尽快发布一个解决方案,如果我能得到它work@GetSet是吗?算术级数不是一个固定的范围吗?而OP表示有兴趣模糊数字/范围,以便产生更容易理解的最小值和最大值。@Spenced即使如此,一些辅助函数也会有所帮助。我开始研究一个解决方案,它“参数化”了“绑定增量”,所以灵活性仍然是可能的,从“更喜欢的范围”的外观来看,第一个范围min是min值本身。最后一个范围的最大值就是最大值本身。第二个范围的最小值和最大值约为1000。后续范围约为1100。“算术级数”可以分阶段执行@Spenced