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,这是一个等价的解决方案.
nic*_*ckf 19
因为你没有停止那里的功能.第四行应为:
return pickServer();
Run Code Online (Sandbox Code Playgroud)
Gum*_*mbo 13
另一种方法是使用do … while
:
function pickServer() {
do {
$varr = rand(1,4);
} while ($varr == 2);
return $varr;
}
Run Code Online (Sandbox Code Playgroud)
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)