在范围内均匀分布的整数

5
假设我有一个范围在0到100之间的区间,并且我希望返回一个包含3个整数的数组,这些整数在该范围内均匀分布,最好的方法是什么?
例如:
范围:0-100 要求:3 返回:25、50、75

我认为你可能误解了均匀分布的含义? - Mitch Wheat
1
所以你想把范围分成N+1个部分?(0-25,26-50,51-75,76-100),并且知道分区值是多少? - Ted Naleid
4个回答

4
伪代码:
function distributeIntegers(int wanted, int rangeLow, int rangeHigh)
    int increment = (rangeHigh - rangeLow) / (wanted + 1)
    array r = new array()
    for (int i = rangeLow + increment; i < rangeHigh; i += increment)
        r.push(i)
    return r

PHP:

function distributeIntegers($wanted = 3, $rangeLow = 0, $rangeHigh = 100){
    $increment = ($rangeHigh - $rangeLow) / ($wanted + 1);
    $r = array();
    for ($i = $rangeLow + $increment; $i < $rangeHigh; $i += $increment)
        $r []= $i;
    return $r;
}
/*
  examples:

  call:
      distributeIntegers();
  returns:
             [0] => 25
             [1] => 50
             [2] => 75

  call:
      distributeIntegers(4);
  returns:
             [0] => 20
             [1] => 40
             [2] => 60
             [3] => 80

  call:
      distributeIntegers(5, 50, 200);
  returns:
             [0] => 75
             [1] => 100
             [2] => 125
             [3] => 150
             [4] => 175
*/

3
你可以使用array_chunk()函数,例如:
$end=100;
$a = range(0,$end);
$chunk=3;
foreach (array_chunk($a,$end/($chunk+1)) as $s){
     print $s[0]."\n";
}

输出

$ php test.php
0
25
50
75
100

如果不需要,您可以摆脱起始点 (0) 和结束点 (100)。


如果$end是一个很大的数字,这种方法非常低效,因为你需要创建一个包含$end个元素的数组。 - John Carter
是的,我假设 OP 已经有一个包含一系列数字的数组。 - ghostdog74

3

这里有一个Groovy的解决方案,可以给出你想要的答案,你应该能够将其切换到你正在使用的任何语言:

def distributedValues(min, max, wanted) {
   def incrementBy = (max - min)/(wanted + 1)
   (1..wanted).collect { count -> min + (count * incrementBy) }
}


assert distributedValues(0, 100, 1) == [50]
assert distributedValues(0, 100, 3) == [25, 50, 75]
assert distributedValues(0, 100, 4) == [20, 40, 60, 80]
assert distributedValues(0, 100, 5) == [16.6666666667, 33.3333333334, 50.0000000001, 66.6666666668, 83.3333333335]
assert distributedValues(100, 200, 3) == [125, 150, 175]

哦,看起来像是 Python,但有波浪线和漂亮的范围指定!我喜欢! - mpen

1
你可以使用rand函数获取特定范围内的随机值。使用以下代码。下面的函数将返回一个数组中的元素集合。
function array_elements( $start = 0 , $end = 100 , $element =5  )

{

$myarray = array () ;

for ( $i = 0 ; $i <  $element;$i++ )

{

   $myarray[$i]= rand ( $start, $end );

}

return $myarray ;

}

print_r ( array_elements() ) ; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接