计算出现次数时注意错误
Notice error while counting number occurrences
我正在创建一个简单的 .php 脚本
- 生成一个包含随机数的数组(比如 1000 个整数)
- 输出一个图像,其中显示所有这些数字的排列,从 0 到绘制的最大数字
输出的是一张图片(给定宽度),这是我得到的:
如您所见,条 在某些时候更高。这是因为图像通常不够宽,无法显示所有数字,所以如果一个像素上有更多数字,则条形会更高。
问题: 有时这个脚本运行良好,但偶尔会出现很多通知错误:
Notice: Undefined offset: 398 in /.../index.php on line 61
Notice: Undefined offset: 125 in /.../index.php on line 61
Notice: Undefined offset: 192 in /.../index.php on line 61 ...
脚本在下面,一些解释:
- 第 61 行标记为红色(下)
- 函数 toScale() returns intval( number / maxNumber * scaleWidth )
- inb4 $counts[num]=0 不必要的双重声明,这就是我试图解决问题的方法,它似乎没有改变任何东西
- $counts 未在这两部分之间的其他任何地方使用
- 注意错误的数量永远不会等于总数,它要么是少数,要么是其中的none。
更新: 如Barmar所述,我代码中的第二个循环可以替换为
$max = max($data); $counts = array_count_values(array_map('toScale', $data));
看起来只是代码简化,但不知何故这解决了问题。为什么?
问题是您在两个循环中以不同的方式缩放数字。
在第一个循环中,每次循环都更新 $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));
我正在创建一个简单的 .php 脚本
- 生成一个包含随机数的数组(比如 1000 个整数)
- 输出一个图像,其中显示所有这些数字的排列,从 0 到绘制的最大数字
输出的是一张图片(给定宽度),这是我得到的:
如您所见,条 在某些时候更高。这是因为图像通常不够宽,无法显示所有数字,所以如果一个像素上有更多数字,则条形会更高。
问题: 有时这个脚本运行良好,但偶尔会出现很多通知错误:
Notice: Undefined offset: 398 in /.../index.php on line 61
Notice: Undefined offset: 125 in /.../index.php on line 61
Notice: Undefined offset: 192 in /.../index.php on line 61 ...
脚本在下面,一些解释:
- 第 61 行标记为红色(下)
- 函数 toScale() returns intval( number / maxNumber * scaleWidth )
- inb4 $counts[num]=0 不必要的双重声明,这就是我试图解决问题的方法,它似乎没有改变任何东西
- $counts 未在这两部分之间的其他任何地方使用
- 注意错误的数量永远不会等于总数,它要么是少数,要么是其中的none。
更新: 如Barmar所述,我代码中的第二个循环可以替换为
$max = max($data); $counts = array_count_values(array_map('toScale', $data));
看起来只是代码简化,但不知何故这解决了问题。为什么?
问题是您在两个循环中以不同的方式缩放数字。
在第一个循环中,每次循环都更新 $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));