使用随机数填充数组,指定数量的元素和数组的总和

时间:2015-10-06 20:23:09

标签: php arrays

我必须使用指定的数字填充数组:

  • 数组之和
  • 元素数量
  • 数组中的值范围

例如:

  • 数组的总和:130
  • 3个数组元素
  • 范围在23到70之间

可能的结果:

array(23, 70, 37)

现在该怎么办?如何分割/分割我的号码?

我从这开始(伪代码):

i=0;
while(sum(number) > 0 and i < arraykeys){
    x = randomize(from, to)
    number = number - x
    myarray[i] = x
    i++
} 

1 个答案:

答案 0 :(得分:2)

这应该适合你:

代码说明

  1. <强>加工性

    我们需要检查的第一件事是,是否可以用范围内的数字构建目标:

    if(checkWorkability($result, $goal, $amountOfElementsLeft, $scope))
    

    意味着它只使用可能的最高值并查看它是否大于目标。

  2. while循环

    在while循环中,我们需要检查是否还有剩余的元素可以使用:

    while($amountOfElementsLeft > 0)
    
  3. 范围调整

    每次迭代我们都需要检查是否需要调整范围,以便最终我们能够建立目标。

    这意味着如果当前的数字总和+最高可能的数字大于目标,我们需要使范围的最大值更小。

    另一方面,当我们无法达到目标时,我们需要让范围的最小值更大。

  4. 代码

    <?php
    
    
        $goal = 130;
        $amountOfElementsLeft = 3;
        $scope = [23, 70];
    
        $result= [];
    
    
        function adjustScope(array $result, $goal, $amountOfElementsLeft, $scope) {
    
            $newScope = $scope;
    
            if($amountOfElementsLeft == 1) {
                $leftOver = $goal - array_sum($result);
                return [$leftOver, $leftOver];
            }
    
    
            if((($goal - (array_sum($result) + $scope[1])) / ($amountOfElementsLeft - 1)) < $scope[0])
                $newScope[1] = (int) ($goal - array_sum($result)) / ($scope[0] * ($amountOfElementsLeft - 1));
            elseif(($adjustTop = $goal - array_sum($result)) < $scope[1])
                $newScope[1] = $adjustTop;
    
            if(($adjustBottom = $goal - (array_sum($result) + $scope[0] + (($amountOfElementsLeft - 1) * $scope[1]))) < $goal && $adjustBottom > 0)
                $newScope[0] = $scope[0] + $adjustBottom;
    
            return $newScope;
    
        }
    
        function checkWorkability(array $result, $goal, $amountOfElementsLeft, $scope) {
            if(array_sum($result) + $amountOfElementsLeft * $scope[1] >= $goal)
                return TRUE;
            return FALSE;
        }
    
    
        if(checkWorkability($result, $goal, $amountOfElementsLeft, $scope)) {
            while($amountOfElementsLeft > 0) {
                $scope = adjustScope($result, $goal, $amountOfElementsLeft, $scope);
    
                $result[] = rand($scope[0], $scope[1]);
                $amountOfElementsLeft--;
    
            }
        }
    
        print_r($result);
        echo array_sum($result);
    
    ?>
    

    可能的输出:

    Array
    (
        [0] => 58
        [1] => 30
        [2] => 42
    ) -> 130
    Array
    (
        [0] => 35
        [1] => 54
        [2] => 41
    ) -> 130
    Array
    (
        [0] => 52
        [1] => 51
        [2] => 27
    ) -> 130