返回随机数但不是2

Abs*_*Abs 5 php random recursion

为什么这有时会返回2?

function pickServer(){
    $varr = rand(1,4);
    if($varr==2){
        pickServer();
    }
    return $varr;
}
Run Code Online (Sandbox Code Playgroud)

Nos*_*dna 26

正如其他人所指出的那样,你的问题的答案就是你的代码在没有返回的情况下失败了.如果2在第一次尝试第二次尝试时调用rand()返回(有1/16的可能性发生这种情况),你将得到2结果.

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

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

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

/* 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;
}
Run Code Online (Sandbox Code Playgroud)

我之前没有注意到,但是balpha期待我的回答.if在他的第二个例子中,他用一个重新映射.他只是在1以上的任何答案中添加了一个,而不是重新映射2到4,这是一个等价的解决方案.

  • 真正的随机RNG可以永远返回2.至少这不会陷入循环中. (2认同)
  • 我想你会发现真正的 RNG 总是返回 4:http://imgs.xkcd.com/comics/random_number.png (2认同)

nic*_*ckf 19

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

return pickServer();
Run Code Online (Sandbox Code Playgroud)

  • 这仍然是递归的并且有潜在危险.请参阅原始问题的评论讨论. (2认同)

Gum*_*mbo 13

另一种方法是使用do … while:

function pickServer() {
    do {
        $varr = rand(1,4);
    } while ($varr == 2);
    return $varr;
}
Run Code Online (Sandbox Code Playgroud)

  • 可以说是更好的,因为大多数语言都没有优化尾递归,而且这一点并不比那些不那么明确. (2认同)
  • 我认为对于手头的问题,递归和循环都是疯狂的.:-) (2认同)

bal*_*pha 10

你可能想要的是什么

function pickServer(){
  $varr = rand(1,4);
  if($varr==2){
    $varr = pickServer();
  }
  return $varr;
}
Run Code Online (Sandbox Code Playgroud)

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

function pickServer(){
  $varr = rand(1,3);
  if($varr > 1){
    $varr = $varr + 1;
  }
  return $varr;
}
Run Code Online (Sandbox Code Playgroud)