/ T maç kriterleri (PHP) 'farkeder etmez rastgele numara alın

4 Cevap php

(Diğer dilleri yaygın yerleşik ins bekliyoruz kullanarak) PHP kullanarak nasıl belirli kriterlere eşleşMEyecektir rastgele (pseudo-random) sayı alabilirim?

IE: Ben istiyorum $x = rand(0, 99) ancak eğer ($x % 9) != 0.

Böyle bir kritere rasgele sayılar sınırlamak için temiz kabul edilebilir bir yol nedir?

Bir örnek olarak, döngü sonra rastgele sayı kullanılarak Sonra, kriterleri karşılayan bir şey olduğunda a while() döngü ve muhtemelen break ing kullanılarak:

while ( ($rand_key = array_rand($array_of_items)) && ($rand_key % 9 == 0) ) 
{ 
    // Do nothing?
}

Ya da bir şey gibi:

while ( $rand_key = array_rand($array_of_items) ) 
{ 
    if ( $rand_key % 9 == 0 ) {
        break;
    }
}

Ya da bu başarmak için daha kısa veya uygun bir yolu var mı?

4 Cevap

Bir do-while aslında olur nadir durumlardan biri

$testData = array( 7, 8, 9 );

do {
  $rand = array_rand( $testData );
} while ( $testData[$rand] % 9 == 0 );

echo $testData[$rand];

Olduğunu kesin kullanım durumda, ya da sadece bir örnektir?

9'a tam katları hariç 0-99 numaralarını almak için (özellikle) çalışıyorsanız, ben garip döngü önlemek için yollar bir çift düşünemiyorum. Eğer sonsuza kadar döngü olabilir çünkü rastgele sayılar üretirken insanlar döngü sevmiyorum. (Eğer son derece şanssız tip değilseniz Ama tabii ki olmayacak -. Spagetti western Clint Eastwood ile gunfights kendini almak olur kişi çeşit)

  1. You could have a lookup table that remaps the random numbers you get into the ones you want.

  2. Generate 0-88 randomly. Multiply the result by 9 and divide it by 8 and get the integer result (floor, not round). Then add 1.

Bunların ikisi de öngörülebilir zamanlama var.

Için alan esnaf alternatif bir yöntem, potansiyel olarak, birden fazla PRNG aramalar, (sizin örnekte olduğu gibi) geçerli sonuçların küçük numaralar ile durumlar için geçerli çözümleri ile bir dizi doldurmak ve diziye bir dizin üretmek için PRNG kullanmak olacaktır .

Eğer ben de uygun ve erişilebilir bir şekilde kısıtlama nedenini belirterek, üretim kodu için, öneririm Hangi yöntemi.

Bu 'özlü' gereksinimi maçlar:

while( ($x = rand(0, 99)) % 9 == 0 );
echo $x;

veya

while ( $array_of_items[$rand_key = array_rand($array_of_items)] % 9 == 0 ); 
echo $array_of_items[$rand_key];

Ancak, çok okunabilir değildir.