【问题标题】:Evenly distributed integers within a range范围内均匀分布的整数
【发布时间】:2010-03-01 02:48:55
【问题描述】:

假设我有一个介于 0 和 100 之间的范围,我希望返回一个包含 3 个整数的数组,这些整数均匀分布在该范围内,最好的方法是什么?

例如:

范围:0-100
通缉:3
返回:25、50、75

【问题讨论】:

  • 我认为您可能误解了统一分布的含义?
  • 所以您想将范围划分为 N+1 个部分? (0-25, 26-50, 51-75, 76-100) 并知道分区值是多少?

标签: php integer numbers range


【解决方案1】:

伪代码:

function foo(int rangeLow, int rangeHigh, int wanted)
    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 标签...

//tested:
function foo($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:
      foo ();
  returned:
             [0] => 25
             [1] => 50
             [2] => 75

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

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

【讨论】:

    【解决方案2】:

    您可以使用 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 元素创建一个数组
    • 是的,我假设 OP 已经有一个包含一系列数字的数组。
    【解决方案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]
    

    【讨论】:

    • :O 它看起来像 python,但带有波浪线和漂亮的范围指定!!!我喜欢!
    【解决方案4】:

    您可以使用 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() ) ; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2010-09-22
      相关资源
      最近更新 更多