dozoqn3347 2012-03-30 13:07
浏览 48
已采纳

在2个具有平均值“x”的数字之间得到“n”个随机值

I want to get n random numbers(e.g n=16)(whole numbers) between 1 to 5(including both) so that average is x.

x can be any value between (1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5).

I am using PHP.

e.g. Suppose I have average x= 3.

Then required 16 whole numbers between 1 to 5(including both). like (1,5,3,3,3,3,2,4,2,4,1,5,1,5,3,3)

Update:

if x=3.5 means average of 16 numbers should be between 3.5 to 4.
and if x=4 means average of 16 numbers should be between 4 to 4.5
and if x=5 means all numbers are 5

  • 写回答

4条回答 默认 最新

  • dongmi4927 2012-03-30 16:33
    关注

    This answer allows any value for the target average (regardless of whether n is odd or even) and avoids the use of recursion to optimize performance.

    The Function

    function getRandomNumbersWithAverage($target_average, $n, $min=1, $max=5)
    {
    
      if($min>$max) list($min, $max) = array($max, $min);
      if($target_average<$min || $target_average>$max) return false;
      else if($target_average==$min) return array_fill(0, $n, $min);
      else if($target_average==$max) return array_fill(0, $n, $max);
    
      if($n<1) return false;
      else if($n==1) return array($target_average);
      else
      {
        $numbers = array();
        for($i=0;$i<$n;$i++)
        {
          $sum = array_sum($numbers);
          $average = $i ? $sum/($i+1) : ($min+$max)/2;
          $contrived_number = $target_average*($i+1) - $sum;
          // Last one must be contrived
          if($i==$n-1) $new_number = ceil($contrived_number); // Round up
          else
          {
            // The tolerance gets smaller with iteration
            $tolerance = ($max-$min)*(1-($i/($n-1)));
            $temp_min = ($contrived_number-$tolerance);
            if($temp_min<$min) $temp_min = $min;
            $temp_max = ($contrived_number+$tolerance);
            if($temp_max>$max) $temp_max = $max;
            $new_number = mt_rand($temp_min, $temp_max);
          }
          if($new_number==0) $new_number = 0; // Handle -0
          $numbers[] = $new_number;
        }
        // Since the numbers get more contrived towards the end, it might be nice to shuffle
        shuffle($numbers);
        return $numbers;
      }
    }
    


    Example Output:

    getRandomNumbersWithAverage(1, 12)
    
    produced the numbers: (1,1,1,1,1,1,1,1,1,1,1,1) having an average of: 1
    
    
    getRandomNumbersWithAverage(1.1, 13)
    
    produced the numbers: (1,1,1,1,1,1,1,4,1,1,1,0,1) having an average of: 1.1538461538462
    
    
    getRandomNumbersWithAverage(2.7, 14)
    
    produced the numbers: (3,3,2,5,1,2,4,3,3,2,3,3,3,1) having an average of: 2.7142857142857
    
    
    getRandomNumbersWithAverage(2.7, 15)
    
    produced the numbers: (3,3,4,3,4,2,1,1,3,2,4,1,5,1,4) having an average of: 2.7333333333333
    
    
    getRandomNumbersWithAverage(3.5, 16)
    
    produced the numbers: (5,5,4,3,1,5,5,1,2,5,3,3,4,4,4,2) having an average of: 3.5
    
    
    getRandomNumbersWithAverage(3.5, 17)
    
    produced the numbers: (5,2,3,5,4,1,2,3,5,4,5,4,2,3,5,3,4) having an average of: 3.5294117647059
    
    
    getRandomNumbersWithAverage(4, 18)
    
    produced the numbers: (3,5,5,3,5,5,3,4,4,4,5,2,5,1,5,4,5,4) having an average of: 4
    
    
    getRandomNumbersWithAverage(4.9, 19)
    
    produced the numbers: (5,5,5,5,7,5,5,5,5,6,5,3,5,5,3,5,5,5,5) having an average of: 4.9473684210526
    
    
    getRandomNumbersWithAverage(5, 20)
    
    produced the numbers: (5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5) having an average of: 5
    
    
    getRandomNumbersWithAverage(0.5, 10)
    
    does not produce numbers
    
    
    getRandomNumbersWithAverage(0, 9)
    
    does not produce numbers
    
    
    getRandomNumbersWithAverage(-1, 8)
    
    does not produce numbers
    
    
    getRandomNumbersWithAverage(5.5, 7)
    
    does not produce numbers
    
    
    getRandomNumbersWithAverage(6, 6)
    
    does not produce numbers
    
    
    getRandomNumbersWithAverage(6, 5, 1, 7)
    
    produced the numbers: (7,7,2,7,7) having an average of: 6
    
    
    getRandomNumbersWithAverage(6, 5, 1, 6)
    
    produced the numbers: (6,6,6,6,6) having an average of: 6
    
    
    getRandomNumbersWithAverage(3, 1)
    
    produced the numbers: (3) having an average of: 3
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥100 iOS开发关于快捷指令截屏后如何将截屏(或从截屏中提取出的文本)回传给本应用并打开指定页面
  • ¥15 unity连接Sqlserver
  • ¥15 图中这种约束条件lingo该怎么表示出来
  • ¥15 VSCode里的Prettier如何实现等式赋值后的对齐效果?
  • ¥15 流式socket文件传输答疑
  • ¥20 keepalive配置业务服务双机单活的方法。业务服务一定是要双机单活的方式
  • ¥50 关于多次提交POST数据后,无法获取到POST数据参数的问题
  • ¥15 win10,这种情况怎么办
  • ¥15 如何在配置使用Prettier的VSCode中通过Better Align插件来对齐等式?(相关搜索:格式化)
  • ¥100 在连接内网VPN时,如何同时保持互联网连接