PHP kullanarak [min - maks] aralığında rastgele sayı


84

Minimum ve maksimuma dayalı rastgele bir sayı oluşturmanın bir yolu var mı?

Örneğin, min 1 ve maks 20 ise, 1 ile 20 dahil 1 ile 20 arasında herhangi bir sayı üretmelidir?


1
Yeni php sürümü, kriptografik olarak güvenli bir rasgele sayı üretecine sahiptir .
— Salvador Dali

1
PHP 7+ kullanım için random_int(), random_bytes()ya da openssl_random_pseudo_bytes() . @Salvador Dali'nin dediği rand()gibi kriptografik olarak güvenli sonuçlar üretmeyin. Php.net/manual/en/function.rand.php
— FrozenFire

Yanıtlar:


148
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>

rand için min ve max'ın sayılar yerine kullanılacak basamak sayısı olduğunu düşündüm :) thnx
— Val

İlgili: Bu cevaptaPHP_INT_MAX < ($max-$min) açıklandığı gibi aralıkları birlikte eklemeniz gerekiyorsa .
— bishop

PHP7.1'den önceki rand () basitçe kötüdür. Öngörülebilir çıktı ile sonuçlanan LCG algoritmasını kullanır. Aynı zamanda yavaştır. PHP7.1 rand (), mt_rand () için bir takma ad yapıldığından artık kötü değil. PHP7 ayrıca kriptografik olarak güvenli random_int () 'i tanıttı, ancak gerekli olmadığı sürece kaçınılmalıdır, çünkü mt_rand ()
— xZero

34

Yeni bir PHP7'de nihayet kriptografik olarak güvenli sözde rastgele tamsayılar için bir destek vardır .

int random_int ( int $min , int $max )

random_int - Kriptografik olarak güvenli sözde rastgele tamsayılar üretir

bu da temelde önceki cevapları geçersiz kılar.


2
Bu harika! Ancak webhost'lar PHP7'yi daha global olarak destekleyene kadar, bu maalesef dağıtım için ürün geliştiren hiç kimse için yararlı değildir. Dolayısıyla, PHP7 üzerinde ALSO'nun çalıştığı önceki cevaplar hala en iyi uygulama.
— Matt Cromwell

1
@MattCromwell. Seninle aynı fikirde değilim. Barındırma hizmetleri PHP7 destekleyen kadar biz polyfill kullanmalıdır random_intve random_bytes- fonksiyonunu github.com/paragonie/random_compat .
— Vladimir Posvistelik

Merak ediyorum, kullanmamanın bir nedeni var random_int mı? Eğer "daha iyi" rasgele sayılar veriyorsa, neden kripto dışı nedenlerle kullanmıyorsunuz?
— Brian Leishman

1
@BrianLeishman Her şey için kullanmayı tercih ederim. Tahmin edebileceğim tek dezavantajı: muhtemelen rastgeleliğin kaynağına dayanır ve rastlantısallığın dışındaysanız başarısız olabilir. Daha pahalı olabilir (kontrol etmeniz gerekiyor) ancak bu tek işlevin büyük bir fark yarattığından şüpheliyim
— Salvador Dali

Daha yavaş olduğunu biliyorum, ancak geri dönüp zaten var olan random_ints'yi s olarak değiştirmemek için yeterince önemsiz rand. Ayrıca, benim kullanım durumum bir yeniden deneme algoritması ve tahmin edilebilir rastgele girdiler nedeniyle uykudan sonra birden fazla başarısız işlevin kümelenmesini kesinlikle istemiyorum
— Brian Leishman

19

Bir daha hızlı daha hızlı bir sürümü kullanmak mt_rand olacaktır:

$min=1;
$max=20;
echo mt_rand($min,$max);

Kaynak: http://www.php.net/manual/en/function.mt-rand.php .

NOT: Bunun çalışması için sunucunuzda Math PHP modülünün etkinleştirilmiş olması gerekir. Aksi takdirde, ana makinenizin onu etkinleştirmesini engelleyin veya normal (ve daha yavaş) rand () kullanmanız gerekir.


6
daha hızlı demek istiyorsun değil mi? aradaki fark (yazarak == daha hızlı ve daha hızlı == performans açısından)
— Val



6

Cevapları burada bir araya getirdim ve sürümden bağımsız hale getirdim;

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}


0

Bunu dene. İsteğinize göre kimlik oluşturacaktır.

function id()
{
 // add limit
$id_length = 20;

// add any character / digit
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
$token = "";
for($i = 1; $i < $id_length; $i ++) {

  // generate randomly within given character/digits
  @$token .= $alfa[rand(1, strlen($alfa))];

}    
return $token;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.