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.