Dönüş Rasgele Sayı değil 2

9 Cevap php

Neden bu bazen 2 döndürür?

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

9 Cevap

Orada işlevini durdurma değil çünkü. Dördüncü satır okumalısınız:

return pickServer();

Sorunuzun cevabı, diğerleri işaret gibi, kod dönmeden yoluyla düşüyor olmasıdır. 2 ilk denemede and ikinci girişimi (bu olay bir 1/16 şans var) hem rand için çağrı () tarafından döndürülen ise, [{alırsınız (0)]}, bir sonuç olarak.

Ama sorunu çözmek için bir yaklaşım daha iyi olabilir.

Özyineleme ve döngü hem de bu sorun için mayalı vardır. Bu, mapping problem, bir randomness sorundur. (O bir red döngü içinde en kolay ele alınabilir bazı yaygın rastlantısallığı kodlama mülakat sorunları benzer, ama gerçekten bu sınıfın bir sorun değildir.)

Sen three sonuçlardan birini değil, four istiyorum. (1, 3, ve 4..) Bu üç rasgele sayılar değil, dört bir dizi üreten gerektiği anlamına gelir. Bir dizi ile eşleştirmek veya bir if kullanabilirsiniz. Her iki olasılık aşağıda gösterilmiştir. Ben sözdizimi yanlış varsa bana haber ver - benim PHPfu bu sabah zayıf.

/* 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;
}

Ben daha önce bunu fark etmedi, ama balpha benim cevap beklenen. Onun ikinci örnekte bir if ile eşleştirilir. Bunun yerine 2-4 remapping, o sadece bir eşdeğer bir çözelti olan 1'in üzerinde herhangi bir cevaba yenisini daha ekledi.

Bunu yapmanın başka bir yolu kullanarak do … while edilir:

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

Ne muhtemelen istiyorum

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

- Ama bu çok uzun özyinelemenin gitmez hiçbir garantisi olmadığını unutmayın. Belki de, böyle bir şey yapmanız gerekir:

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

Eğer pickserver dönmez 2 değer olduğunda çünkü. Ve fonksiyon $ varr dönmek devam ediyor.

Ben bu gibi pek bir şey olur:

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

Bu 2 değil başka bir numara almak için ardışık işlevini çağırır, ancak bu sonuç ile hiçbir şey yapmaz.

pickServer() return pickServer() ile değiştirmeyi deneyin.

Döndürülen değeri 2 değil kadar sadece döngüler, böylece daha iyi hala, iteratif fonksiyon yazmak.

Sen değerini döndürmek için unuttum ...

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

Sen özyineleme çıkarın ve rastgele seçilen 2 eşleştirmek. Simply 1 (Bu durumda 2) aralığını azaltmak ve aralığın başlangıcını haritası.

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