Php rastgele sayı üreteci. PHP rastgele kullanma. PHP'de rastgele sayılar

  • 20.06.2020

Merhaba! Bu yazıda, bakacağız PHP 7.1'de rastgele sayılar üretmeye yönelik yenilikler.

Bu güncelleme geliştiricilere görünmez bir şekilde gerçekleşti, ancak programlama dilini geliştirdi PHP rastgele sayı üretimi alanında.

Bilindiği kadarıyla içinde PHP fonksiyonu kullanabiliriz rand(min, maks) rastgele sayılar üretmek için:

yankı rand(7, 17);

Şimdi sayfayı yenilerseniz, her seferinde yeni bir rastgele sayı alacaksınız.

Ama her şey göründüğü kadar basit değil. Mesele şu ki, rasgele sayıyı ne için ürettiğinize bağlı olarak, işlev rand() farklı nesil sistemleri kullanır. Onlar. kullanıldığı sisteme bağlıdır. Bazı sistemler zayıf üretim yöntemleri kullanabilir, bu nedenle tamamen rastgele olmayan sayılar elde edersiniz.

AT PHP 7.1 bu sorun düzeltildi ve bir özellik eklendi mt_rand():

yankı mt_rand(7, 17);

Bu özellik, güvenlik de dahil olmak üzere çok daha iyi çalışır. Ayrıca bilinmesi gereken önemli bir nokta da, işlevi kullanırsanız rand() içinde PHP 7.1, ardından otomatik olarak üzerine yazılacaktır mt_rand(). Onlar. rand()şimdi sadece bir takma ad mt_rand().

Rastgele sonuçlar elde etmek için diğer birçok işlev, PHP 7.1. Örneğin, bir diziden nasıl rastgele bir değer alabileceğimize bakalım:

$isimler = ["İvan", "İskender", "Vasili"];
echo $isimler;

Onlar. bunun gibi herhangi bir işlev, daha iyi rasgele sayılar üretmek için geliştirildi. PHP 7.1. Evet, bu güncelleme fark edilmedi, ancak hangi dilde yazarsanız yazın, bir fonksiyonun içinde neler olduğunu ve nasıl davrandığını anlamak çok önemlidir.

Rastgele bir sayı oluşturmak için PHP rand() veya mt_rand() işlevini kullanabilirsiniz. Değişkenleri, dosyaları adlandırmak, anahtar bilgileri oluşturmak ve güvenliği sağlamak için pratikte rastgele sayılar kullanma gereksinimi ortaya çıkar.

Rastgelelik ve benzersizlik

PHP rastgele işlevi iki şekilde gelir: Rand() ve mt_rand(). İlk durumda algoritmanın daha basit olduğuna ve sözde rasgele sayılar ürettiğine inanılmaktadır. İkinci seçenek daha hızlı bir algoritmaya ve bilinen matematiksel özelliklere sahiptir. Rastgele bir sayı almanız gereken çoğu durumda, benzersiz bir sayı kombinasyonu elde etmek için bir dizi PHP rastgele çağrı kullanabilirsiniz.

1'den 26'ya veya 1'den 32'ye kadar sayıları temel alarak rastgele alırsak, Latin veya Kiril harflerinin bir dizisi olarak anahtar bilgileri oluşturabiliriz. Bu durumda PHP rastgele, örneğin iletişim kanallarını veya algoritmaları test etme amacıyla bir dizi alfabetik bilgi oluşturmanın bir yoludur.

Rastgele bir sayı nadiren benzersizdir, çünkü rastgele bir değişkenin dağılım yasasına göre birden çok kez görünebilir. Ancak, özellikle JavaScript dilinin statik değişkeni PHP ve Math.random'u birleştirirseniz, zamanla tekrarlanmayacak gerçek bir benzersiz rasgele sayı elde edebilirsiniz.

zaman fonksiyonunu kullanma

Hem PHP hem de JavaScript olan zaman işlevi, zamanın bir noktasında yeterince büyük sayıda olay meydana geldiğinde ve rastgele değer tekrarlandığında nadiren benzersiz sayı kombinasyonları oluşturmanıza olanak tanır.

PHP'yi saniye veya milisaniye aralığında, çok çeşitli olası değerlerle rastgele uygulayarak, benzersiz rastgele sayı veya harf kombinasyonları elde edebilirsiniz. Başka?

Sürekli artan bir sayı ve PHP rastgele veya zaman fonksiyonunun değerini birleştirerek, istemci ve sunucu iletişim kanallarının güvenilir güvenliğini sağlayabilir, değişkenler için benzersiz kodlar oluşturabilir ve algoritmalarda öngörülemeyen olaylar oluşturabilirsiniz.

PHP Rastgele Sayı Üreticisi, özellikle minimum maliyetle hızlı bir şekilde yüksek kaliteli sonuçlar almanız gerektiğinde, çoğu görev için harika bir çözümdür. Rand() ve mt_rand işlevlerinin sıralı olarak büyüyen sayı dizileri veya zaman değerleri ile birlikte kullanılması, hem değerlerde tekrarlanan hem de benzersiz olan rasgele sayılar elde etmenizi sağlar.

Görev
Sayısal bir aralıkta rastgele bir sayı oluşturmanız gerekir.

Karar
mt_rand() işlevi bunun için tasarlanmıştır:

// $üst ve $alt arasında rastgele sayı, dahil
$random_number = mt_rand($alt, $üst);

Tartışma
Rastgele sayı oluşturma, ekranda rastgele bir resim görüntülemeniz, bir oyunda rastgele bir başlangıç ​​noktası atamanız, bir veritabanından rastgele bir giriş seçmeniz veya benzersiz bir oturum kimliği oluşturmanız gerektiğinde kullanışlıdır. İki nokta arasında rastgele bir sayı üretmek için mt_rand() işlevine iki argüman iletilmelidir:

$rastgele_sayı = mt_rand(1, 100);

mt_rand() işlevinin bağımsız değişken olmadan çağrılması, sıfır ile mt_getrandmax() işlevi tarafından döndürülen maksimum rasgele sayı arasında bir sayı döndürür. Bir bilgisayarın gerçekten rastgele bir sayı üretmesi zordur. Talimatları metodik olarak takip etmede çok daha iyidir ve kendiliğinden harekete geçmesi gerektiğinde o kadar iyi değildir. Bir bilgisayarın rasgele bir sayı vermesini istiyorsanız, o zaman ona belirli bir tekrarlanabilir komutlar dizisi vermeniz gerekir, oysa tekrarlanabilirlik gerçeği rasgelelik elde etme olasılığını azaltır.

PHP'nin iki farklı rasgele sayı üreteci vardır: Rand() adlı klasik bir işlev ve daha gelişmiş bir mt_rand() işlevi.

MT (Mersenne Twister), adını asal sayıları keşfeden Fransız keşiş ve matematikçi Marin Mersenne'den alan sözde rastgele bir sayı üretecidir. Bu jeneratörün algoritması bu asal sayılara dayanmaktadır. mt_rand() işlevi, Rand() işlevinden daha hızlıdır ve daha fazla rasgele sayı üretir, bu nedenle ilkini tercih ederiz.

PHP'nin 4.2'den önceki bir sürümüne sahipseniz, mt_rand() (veya Rand()) işlevini ilk kez çağırmadan önce, mt_srand() (veya srand() işlevini çağırarak üreteci bir başlangıç ​​değeriyle başlatmanız gerekir. )) işlev. Çekirdek değer, rastgele işlevin döndürdüğü rastgele sayıları oluşturmak için temel olarak kullandığı sayıdır; yukarıda bahsedilen ikilemi çözmenin bir yolunu ifade eder - yinelemeye karşı rastgelelik.

Çok hızlı değişen ve tekrarlanabilirlik şansı çok az olan bir başlangıç ​​değeri olarak (bunlar iyi bir başlangıç ​​değerinin karakterize edilmesi gereken özelliklerdir), yüksek hassasiyetli microtime() zaman işlevi tarafından döndürülen değeri alabilirsiniz. Jeneratörü bir kez başlatmak yeterlidir. PHP 4.2 ve sonraki sürümleri başlatmayı otomatik olarak gerçekleştirir, ancak başlangıç ​​değeri mt_rand() işlevine yapılan ilk çağrıdan önce manuel olarak ayarlanırsa, PHP bunu kendi başlangıç ​​değeriyle değiştirmez.

Veritabanından rastgele bir kayıt seçmeniz gerekiyorsa, bunun en kolay yolu önce tablodaki toplam alan sayısını belirlemek, bu aralıktan rastgele bir sayı seçmek ve ardından veritabanından bu satırı sorgulamaktır:

$sth = $dbh->query("SAYI SEÇ(*) OLARAK tırnaklardan sayım");
if ($satır = $sth->fetchRow()) (
$say = $satır;
) başka (
die($row->getMessage());
}
$rastgele = mt_rand(0, $say - 1);
$sth = $dbh->query("LIMIT $rastgele,1 tırnaktan alıntıyı SEÇİN");
while ($satır = $sth->fetchRow()) (
$satır yazdır

"\n";
}

Bu kod parçası, tablodaki toplam satır sayısını belirler, bu aralıktan rastgele bir sayı üretir ve ardından $random konumundan başlayarak tablodan bir satır SEÇMEK için LIMIT $random,1 kullanır. MySQL sürüm 3.23 veya üzeri sürümlerde bir alternatif mümkündür:

$sth = $dbh->query("RAND() LIMIT 1'E GÖRE SİPARİŞTEN alıntı SEÇİN");
while ($satır = $sth->fetchRow()) (
$satır yazdır "\n";
}

Bu durumda, MySQL önce satırları rasgele hale getirir ve ardından ilk satırı döndürür.

Birkaç kez nasıl yaptığımı sordum alıntıların rastgele çıktısı sitenizde blokta " Akıllı Alıntılar". Ayrıca, buradaki sorunun insanların yanlış anlaşılmasıyla ilgili olduğunu bulmayı başardım, php'de diziden rastgele eleman nasıl alınır. Görev basittir, ancak yine de sorular ortaya çıktığı için onlara cevap vermek gerekir.

Kodu hemen vereyim. Diyelim ki bir dizi tırnak içeren bir dizi var. Ve bunlardan rastgele birini seçip çıktı almanız gerekiyor:

$tırnak = dizi(); // Boş bir dizi başlat
$quotes = "Düşüncelerinize dikkat edin, onlar eylemlerin başlangıcıdır."; // İlk alıntı
$quotes = "Hayatta kalanlar en zeki veya en güçlü değil, değişime en açık olandır."; // İkinci alıntı
$quotes = "Hayat bir dağdır: yavaş çık, hızla aşağı in."; // Üçüncü alıntı
$quotes = "İnsanlar zengin olmak istemez, insanlar diğerlerinden daha zengin olmak ister."; // Dördüncü alıntı
$sayı = mt_rand(0, sayı($tırnak) - 1); // 0'dan (dizi uzunluğu eksi 1) dahil olmak üzere rastgele bir sayı alın
echo $tırnak[$sayı]; // Çıktı teklifi
?>

kilit nokta rastgele sayı alma. Tek yapmanız gereken doğru sınırları belirlemek. Dizinin tüm uzunluğu boyunca rastgele bir öğe seçmeniz gerekiyorsa, bu 0 önceki ( dizi uzunluğu eksi 1). Ve sonra sadece verilen rasgele indeks ile diziden eleman çekin.

Tırnak içeren göreve gelince, bunları bir veritabanında saklamak daha iyidir. Prensip olarak, site çok basitse, bir metin dosyasında mümkündür. Ancak bir veritabanındaysa, kullanmak daha iyidir RAND() ve SINIR içinde SQL sorgusu böylece veritabanından hemen tek ve rastgele bir fiyat teklifi alırsınız.