为什么这有时会返回2?
function pickServer(){
$varr = rand(1,4);
if($varr==2){
pickServer();
}
return $varr;
}
答案 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;
}