1

我有一些代码偶尔会返回和“未定义的偏移量 8”。

我搜索并找不到“未定义的偏移量”定义,使其更加神秘。

这是代码:

while($lowest_plays !== $plays[$x]){
    $x = rand(0,count($plays));
}

偏移发生在 while 循环上,这似乎是这个特定偏移通常发生的地方。$lowest_plays 和 $plays 变量总是正常的,我看不到“未定义偏移”发生时的任何模式。

变量是和$x之间的随机数。0$plays-1

以下是“未定义偏移 8”通知之一的值:

Plays: Array ( [0] => 147 [1] => 147 [2] => 146 [3] => 147 [4] => 147 [5] => 146 [6] => 147 [7] => 146 ) 
Lowest Plays: 146
Random variable ($): 1
4

5 回答 5

5

数组是零索引的,所以数组项是 $plays[0].. 直到 $plays[7]。count是 8 - 元素的总数。所以你需要

$x = rand(0,count($plays) - 1);

否则在某个阶段,您会尝试阅读$plays[8]不存在的内容。

于 2013-07-09T01:59:47.780 回答
2

引用您的问题:

变量 $x 是一个介于 0 和 $plays - 1 之间的随机数。

如果那是真的,你不会有问题,但是查看 的返回值rand(min, max),它指出(突出显示我自己的):

介于 min (或 0)和 max (或getrandmax()包括)之间的伪随机值。

因此,正确的说法应该是:

$x = rand(0,count($plays) - 1);
于 2013-07-09T02:10:03.390 回答
1

$plays中,您没有任何索引为 8 的条目。该rand函数包括两者$min$max因此您需要

$x = rand(0, count($plays)-1);
于 2013-07-09T02:00:36.790 回答
1

您正在生成一个介于 0 和之间的随机数,count($plays)用作 $plays[] 的索引。play 的大小是 8 个元素,但索引从 0 到 7。

你应该像这样计算你的随机数:

while($lowest_plays !== $plays[$x]){
  $x = rand(0,count($plays)-1);    // random from 0 to 7
}
于 2013-07-09T02:02:51.263 回答
1

数组中有 8 个元素,所以

rand(0, count($plays))

会给你一个从 0 到 8 的随机整数;

如果它碰巧给了你 8,而你尝试访问 $plays[8],那就是错误所在。正确的方法:

rand(0, count($plays)-1)
于 2013-07-09T02:03:27.667 回答