【发布时间】:2009-08-19 15:37:56
【问题描述】:
为什么有时会返回 2?
function pickServer(){
$varr = rand(1,4);
if($varr==2){
pickServer();
}
return $varr;
}
【问题讨论】:
-
谢谢大家,都正确,但我只能选择一个。 :)
-
实际上他们中的大多数都错过了真正的问题(包括接受的答案)。不要将递归用作 Goto。在 $var=rand(1,4) 调用周围放置一个循环,直到它返回一个值!=2,不要在此方法内再次调用 pickServer。想想孩子们!想想你的堆栈框架!如果您运行此代码并连续获得 2,则理论上您可以创建 StackOverflow 条件,我不是在谈论问答 Wiki 站点。
-
根本不循环。您的随机生成范围太大 - 您看不到它,因为您要排除的数字在范围内。如果它在开头或结尾你不会循环,那么为什么仅仅因为它在中间就循环呢?重新映射。
-
+! JohnFX - 谢谢。这就是我刚刚写的。其中许多解决方案在技术上可能有效,但具有不确定的 和 递归(包括接受的答案)的不良副作用。这是一个危险的组合,它会变成一个虚幻的错误,会随机崩溃你的系统……偶尔……没有明显的原因。
-
@Nosredna - 我同意。最技术上正确的答案是将您的随机空间重新映射到不包含“2”的空间。然后您的方法将在 O(1) 时间内执行。在方法内部循环是一种快速、实用的方法,可以解决基本问题,但从学术角度来看并不是最佳解决方案。但我确实同意你的观点,方法不应该是不确定的并且肯定不是递归的。