返回随机数但不是2

时间:2009-08-19 15:37:56

标签: php recursion random

为什么这有时会返回2?

function pickServer(){
    $varr = rand(1,4);
    if($varr==2){
        pickServer();
    }
    return $varr;
}

10 个答案:

答案 0 :(得分:26)

正如其他人所指出的那样,你的问题的答案是你的代码没有返回。如果在第一次尝试第二次尝试时调用rand()返回2(这种情况发生的概率为1/16),您将获得{{1}结果。

但是你解决问题的方法可能会更好。

递归和循环都是这个问题的障碍。这是映射问题,而不是随机问题。 (它类似于一些常见的随机编码访谈问题,可以在拒绝循环中最容易处理,但它确实不是该类的问题。)

你想要一个三个结果,而不是四个。 (1,3和4)这意味着你应该生成一个三个随机数的范围,而不是四个。您可以使用数组重新映射或使用2。两种可能性如下所示。如果我的语法错误,请告诉我 - 我的PHPfu今天早上很弱。

if

我之前没有注意到,但是balpha期待我的回答。在他的第二个例子中,他用/* array remapping */ function pickServer() { $remap = array(1, 3, 4); return $remap[rand(1,3)]; } /* if remapping */ function pickServer() { $server = rand(1,3); if ($server==2) { $server=4; } return $server; } 重新映射。他没有重新映射2到4,而是在1以上的任何答案中加了一个,这是一个等价的解决方案。

答案 1 :(得分:19)

因为你没有停止那里的功能。第四行应为:

return pickServer();

答案 2 :(得分:13)

另一种方法是使用do … while

function pickServer() {
    do {
        $varr = rand(1,4);
    } while ($varr == 2);
    return $varr;
}

答案 3 :(得分:10)

你可能想要的是

function pickServer(){
  $varr = rand(1,4);
  if($varr==2){
    $varr = pickServer();
  }
  return $varr;
}

- 但请注意,不能保证这不会进行太长的递归。也许你应该做这样的事情:

function pickServer(){
  $varr = rand(1,3);
  if($varr > 1){
    $varr = $varr + 1;
  }
  return $varr;
}

答案 4 :(得分:2)

因为当值为2时,您不会返回pickserver。函数继续返回$ varr。

答案 5 :(得分:2)

function pickServer(){
    $varr = rand(1,4);
    if($varr==2){
        return pickServer(); //leave here
    }
    return $varr;
}

答案 6 :(得分:1)

我会这样:

function pickServer()
{
$servers = array(1,3,4);
return $servers[rand(1,count($servers))]; 
}

答案 7 :(得分:0)

它以递归方式调用该函数来获取另一个不是2的数字,但对该结果不做任何操作。

尝试将 pickServer()更改为返回pickServer()

更好的是,迭代地编写函数,使它只循环,直到返回的值不是2。

答案 8 :(得分:0)

您忘了返回值...

function pickServer(){
$varr = rand(1,4);
if($varr==2){
    return pickServer();
}
return $varr;
}

答案 9 :(得分:0)

您可以删除递归并重新映射随机选择的2.只需缩小范围并将范围的开头(在本例中为2)映射为1.

function pickServer(){
    $varr = rand(2,4);
    if($varr==2){
        return 1;
    }
    return $varr;
}