-1

我正在创建一个简单的 .php 脚本

  1. 生成一个带有随机数的数组(比如说 1000 个整数)
  2. 输出图像,其中显示所有这些数字的排列,范围从 0 到绘制的最大数字

输出是一个图像(具有给定的宽度),这就是我得到的:

图像输出示例

如您所见,在某些时候,条形更高。这是因为图像通常不够宽,无法呈现所有数字,所以如果一个像素上有更多数字,则条形图会更高。

问题:有时这个脚本运行良好,但偶尔我会收到很多通知错误:

注意:未定义的偏移量:第61行 /.../index.php 中的398

注意:未定义的偏移量:第61行 /.../index.php 中的125

注意:未定义的偏移量:第61行 /.../index.php 中的192 ...

脚本如下,一些解释:

  • 第 61 行标记为红色(下)
  • 函数 toScale() 返回 intval( number / maxNumber * scaleWidth )
  • inb4 $counts[num]=0 不必要的双重声明,这就是我试图解决问题所做的,它似乎没有改变任何东西
  • $counts不在这两个部分之间的任何其他地方使用
  • 通知错误的数量永远不会等于总数,它要么是少数,要么都不是。

代码截图

更新:正如Barmar提到的,我的代码中的第二个循环可以替换为

$max = max($data); $counts = array_count_values(array_map('toScale', $data));

它看起来只是代码简化,但这以某种方式解决了问题。为什么?

4

1 回答 1

3

问题是你在两个循环中以不同的方式缩放你的数字。

在第一个循环中,您$max每次都通过循环进行更新,然后调用toScale(data[$x]). 由于toScale()取决于$max,一些数字将被缩放到不同的最大值。

在第二个循环中,所有内容都缩放到最终最大值。因此,对于相同的值,这次$data[$a]你会得到不同的值。toScale($data[$a])

您需要在调用之前计算所有数字的最大值toScale。一种方法是计算生成所有随机数的循环中的最大值:

$max = 0;
for ($a = 0; $a < $num; $a++) {
    $rand = rand();
    if ($rand > $max) {
        $max = $rand;
    }
    $data[] = $rand;
}

或者您可以使用内置函数来执行此操作:

$max = max($data);
$counts = array_count_values(array_map('toScale', $data));
于 2018-11-16T00:57:34.303 回答