【问题标题】:rand() function not working as expected (nested within foreach())?rand() 函数没有按预期工作(嵌套在 foreach() 中)?
【发布时间】:2011-09-04 22:16:00
【问题描述】:

想法是发布一个最大值和一个最小值,然后生成两者之间的随机数。

例如$mins = array(30,40,50,60)$maxs = array(40,50,60,70),然后是我的代码:

foreach($mins as $minkey => $maxval) {
    foreach($maxs as $maxkey => $maxval) {
            $hits[$maxkey] = rand($minval,$maxval);
    }
}

如果我然后var_dump($mins)var_dump($maxs)var_dump($hits),我得到:

array(4) { [1]=> string(2) "30" [2]=> string(2) "40" [3]=> string(2) "50" [4]=> string(2) "60" } array(4) { [1]=> string(2) "40" [2]=> string(2) "50" [3]=> string(2) "60" [4]=> string(2) "70" } array(4) { [1]=> int(27) [2]=> int(36) [3]=> int(19) [4]=> int(41) }

我认为$maxs$mins 包含字符串值,而$hits 包含整数(即rand() 需要整数输入?)可能是问题所在,因此我将循环更新为:

foreach($mins as $minkey => $minval) {
    foreach($maxs as $maxkey => $maxval) {
        $minval = (int)$minval;
        $maxval = (int)$maxval;
            $hits[$maxkey] = rand($minval,$maxval);
    }
}

但是在var_dump($mins)var_dump($maxs)var_dump($hits) 上,这个被丢弃了:

array(4) { [1]=> string(2) "30" [2]=> string(2) "40" [3]=> string(2) "50" [4]=> string(2) "60" } array(4) { [1]=> string(2) "40" [2]=> string(2) "50" [3]=> string(2) "60" [4]=> string(2) "70" } array(4) { [1]=> int(0) [2]=> int(47) [3]=> int(0) [4]=> int(55) }

有人知道为什么这没有按预期工作吗?

非常感谢任何想法/答案/cmets :)!

【问题讨论】:

  • 这段代码运行良好(参见ideone.com/0xD5l)。其他地方一定有错误。
  • 奥利,20和13不在30-40和40-50之间?
  • 啊,我看到你刚刚编辑了你的问题。所以让我改述一下;这段代码完全按照我的预期运行。
  • 您是要生成 4 个随机数还是 16 个?
  • 4,在不同的范围之间(30-40),(40-50等,每个键一个。我现在已将其更改为使用for()循环,因为我的键是数字的,它工作正常,但我仍然不确定为什么它不能使用foreach()

标签: php loops random


【解决方案1】:

你想这样做吗? 如果是,则不能在另一个循环中使用一个循环...

for($i = 1; $i <= sizeof($mins); $i++) {
  $hits[$i] = rand($mins[$i], $maxs[$i]);
}

【讨论】:

  • 已编辑,但感谢您的基础。我真的不知道为什么我一开始没有使用for() 循环,我的键是数字和匹配的,所以我应该默认使用它。
  • 是的,我忘记了 =1 来初始化...(我已接受编辑;o))
【解决方案2】:

对于一个你正在覆盖你的变量的人:

foreach($mins as $minkey => $maxval) {
    foreach($maxs as $maxkey => $maxval) {
            $hits[$maxkey] = rand($minval,$maxval);
    }
}

我假设应该是:

foreach($mins as $minkey => $minval) {
    foreach($maxs as $maxkey => $maxval) {
            $hits[$maxkey] = rand($minval,$maxval);
    }
}

【讨论】:

  • 这可能是问题所在!愚蠢的我,我会在一分钟内回复:)。
  • 仍在转储:array(4) { [1]=&gt; int(49) [2]=&gt; int(53) [3]=&gt; int(60) [4]=&gt; int(63) }。最后两个值在它们的正确范围内 (50 - 60)、(60 - 70),但不适合前两个。
【解决方案3】:

不知道预期的结果是什么,但试试这个:

for ($i=0, $len = count($mins); $i < $len; $i++) {
    $hits[$i] = rand($mins[$i], $maxs[$i]);
}

【讨论】:

    【解决方案4】:

    您的第一个 foreach 循环似乎有错字,应该是

    foreach($mins as $minkey => $minval)
    

    这会导致抛出 E_NOTICE 错误,并且还会阻止 rand 工作,因为 minval 不存在。将 error_reporting 设置为显示开发中的通知总是一个好主意,您可以通过在代码开头添加它来轻松地做到这一点:

    error_reporting(E_ALL);
    

    更多信息请参见php error reporting

    【讨论】:

    • 感谢您的想法,问题不止于此,但从现在开始我肯定会使用错误报告!
    猜你喜欢
    • 2021-12-04
    • 2015-03-23
    • 1970-01-01
    • 2020-12-27
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多