Php en iyi rastgele sayı üretecidir. Bir aralıkta rastgele sayılar üretin. Zaman işlevini kullanma

  • 03.11.2019

Teknik olarak, "rastgele sayı üreteci" terimi, sayıların kendileri rastgele olmadığı için saçmadır. Örneğin, 100 rastgele bir sayı mı? 25'e ne dersin? Bu terimin gerçekten anlamı, rastgele görünen bir sayı dizisinin oluşturulmasıdır. Bu daha zor bir soruyu akla getiriyor: Rastgele sayı dizisi nedir? Tek doğru cevap şudur: rastgele sayılar dizisi, tüm öğelerin ilgisiz olduğu bir dizidir. Bu tanım öyle bir paradoksa yol açar ki, bu dizinin nasıl elde edildiğine bağlı olarak herhangi bir dizi rastgele veya rastgele olmayabilir. Örneğin, aşağıdaki sayı dizisi
1 2 3 4 5 6 7 8 9 0
klavyenin üst satırı sırayla yazılarak elde edildi, bu nedenle dizi rastgele oluşturulmuş olarak kabul edilemez. Ama ya aynı diziyi fıçıdan numaralı tenis toplarını alarak elde ederseniz. Bu durumda, bu zaten rastgele oluşturulmuş bir dizidir. Bu örnek, bir dizinin rastgeleliğinin kendisine değil, nasıl elde edildiğine bağlı olduğunu göstermektedir.

Bir bilgisayar tarafından üretilen sayı dizisinin deterministik olduğunu unutmayın: birincisi hariç her sayı kendinden önceki sayılara bağlıdır. Teknik olarak bu, bir bilgisayar tarafından yalnızca yarı rasgele bir sayı dizisinin oluşturulabileceği anlamına gelir; aslında, gerçekten rastgele değiller. Ancak bu çoğu problem için yeterlidir ve basitlik için bu tür diziler rastgele olarak adlandırılacaktır. John von Neumann tarafından çok ilginç bir yöntem geliştirildi; genellikle RMS olarak adlandırılır. Bu yöntemde, bir önceki rastgele sayının karesi alınır ve ardından sonuçtan ortadaki rakamlar çıkarılır. Örneğin, üç basamaklı sayılar oluşturuyorsanız ve önceki sayı 121 ise, sonucun karesini almak 14641'dir. Ortadaki üç basamağı çıkarmak bir sonraki rasgele sayı 464'ü verir. Bu yöntemin dezavantajı, çok kısa bir tekrara sahip olmasıdır. döngü denilen dönem. Bu nedenle günümüzde bu yöntem kullanılmamaktadır. Rastgele sayılar üretmek için modern yöntemler çok daha karmaşıktır.

PHP'de rastgele sayılar

PHP'nin rastgele sayılarla çalışmak için iki grup işlevi vardır. Dışa doğru, gruplardan birinin tüm işlevleri için mt_ öneki ile ayırt edilebilirler.

Kullanımdan Kaldırılan Özellikler
rand işlevi. Sıfırdan RAND_MAX'a (32767 olan) bir tamsayı döndürür. İki isteğe bağlı tamsayı parametresine sahip olabilir - bunlar belirtilirse, ilk parametreden ikinciye rastgele bir sayı oluşturulur.

yankı ran(); yankı rand(1,100); // 1'den 100'e kadar rastgele bir sayı ver

srand işlevi. Rand işlevi tarafından döndürülen rastgele sayıların sırasını belirtir. Bir tamsayı parametresine sahiptir - bu parametrenin farklı değerleriyle, rand farklı sayı dizileri üretecektir. Rand işlevine yapılan tüm çağrılardan önce, srand işlevinin yalnızca bir kez çağrılması gerekir. Kullanım örneği:

Srand(1288); //($i=0; $i için rasgele sayı üretecinin başlatılması)<5;$i++){ echo rand(); echo "
"; }

Dikkat! PHP 4.2.0'dan itibaren, srand() öğesini çağırmanıza gerek yoktur - PHP bunu otomatik olarak yapar.
getrandmax() işlevi. Maksimum rastgele sayının (32767) değerini döndürür.

İkinci grubun işlevleri (mt_ öneki ile)
Adları ve eylemleri, ilk grubun işlevlerine benzer - mt_rand, mt_srand ve mt_getrandmax. Temel fark, rastgele sayıların daha geniş bir aralıktan alınmasıdır: 0'dan 2'ye 19937 − 1 Ayrıca, bu işlevler, 1997'de Japon bilim adamları tarafından geliştirilen Mersenne Twister rastgele sayı üretecini kullandıkları için eski eşdeğerlerinden çok daha hızlı çalışır. . Bu nedenle mt_ (Mersenne Twister) öneki.
Kullanım örneği:

// 1000 ile 2000 arasında rastgele bir sayı üret echo mt_rand(1000, 2000);

JavaScript'te rastgele sayılar

JavaScript'te rastgele sayı Math.random() ile oluşturulabilir. Ancak, 0 ile 1 arasında bir kesirli sayı olacaktır (0 ve 1 dahil değil). İstenilen aralıkta rastgele bir tamsayı oluşturmak için kendi fonksiyonunuzu yazmanız gerekir.

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 durumdaki 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 etmek 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 işlevini kullanma

Hem PHP hem de JavaScript olan zaman işlevi, zaman içinde bir noktada 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 çok çeşitli olası değerlerle saniye veya milisaniye aralığında rastgele uygulayarak, benzersiz rastgele sayı veya harf kombinasyonları elde edebilirsiniz. Başka?

Zaman fonksiyonunun değerini, sürekli artan bir sayı ve PHP rastgele veya 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 artan 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.

Rastgele sayı üretecinin başlatılmasını gerçekleştirir. Sözdizimi:

void srand(int tohum)

Çekirdek değeriyle rasgele sayı üretecini başlatır.

Srand((çift) microtime()*1000000);
$rastgele = Rand();
yankı $rastgele;

GETRANDMAX

Mümkün olan en büyük rastgele sayıyı döndürür. Sözdizimi:

int getrandmax()

Bu işlev, rasgele sayı üretme işlevi Rand() kullanılarak elde edilebilecek maksimum değeri döndürür.

Genellikle 32767

Rastgele bir sayı üretir. Sözdizimi:

Int rand(])

Bu işlev, isteğe bağlı min ve maks parametreleriyle çağrıldığında, bu parametreler de dahil olmak üzere rastgele bir sayı üretir. Min ve max parametreleri yoksa, 0 ile RAND_MAX arasında bir sayı döndürülür.

Bu işlevin doğru çalışması için, kullanmadan önce rasgele sayı üretecini srand() işleviyle başlatmanız gerekir.

lcg_değer()

LCG Sözde Rastgele Sayı Üreticisi (PHP 4, PHP 5)

Tanım:

Float lcg_value(void)

lcg_value(), (0, 1) aralığında bir sözde rasgele sayı döndürür. İşlev, bir periyotta iki c 2^31 - 85 ve 2^31 - 249 üretecini birleştirir.

mt_getrandmax()

Olası en büyük rastgele değeri gösterir (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Tanım:

int mt_getrandmax(void)

mt_rand() işlevi tarafından döndürülebilecek maksimum değeri gösterir.

mt_rand()

En iyi rastgele değeri üretir (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Tanım:

int mt_rand()

Birçok eski rasgele sayı üreteci şüpheli performansa sahiptir ve yavaştır. PHP, varsayılan olarak Rand() işlevinin rastgele sayı üretecini kullanır. mt_rand() işlevi bunun için iyi bir alternatiftir. Rand()'dan 4 kat daha hızlı olan bir rastgele sayı üreteci kullanır ve Mersenne Twister kullanır.

İsteğe bağlı min ve maks bağımsız değişkenleri olmadan çağrılan mt_rand(), 0 ile RAND_MAX arasında sözde rasgele bir değer döndürür. Örneğin, 5 ile 15 arasında rastgele değerler almanız gerekiyorsa, mt_rand (5, 15) arayın.

mt_rand() örneği

yankı mt_rand() . "\n";
yankı mt_rand() . "\n";

yankı mt_rand(5, 15);
?>

Bu örneği çalıştırmanın sonucu şöyle bir şey olacaktır:

1604716014
1478613278
6

Yorum

Yorum: 3.0.7'den önceki sürümlerde, işlevin ikinci parametresi bir sayı aralığı belirtir. Örneğin, 5 ile 15 arasında rastgele sayılar elde etmek için bu sürümler mt_rand(5, 11) işlevinin belirtilmesini gerektirir.

mt_srand()

En iyi rastgele sayı üretecinin başlangıç ​​değerini ayarlar (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Tanım:

Void mt_srand()

Tohum kullanarak rasgele sayı üretecinin başlangıç ​​değerini ayarlar. PHP 4.2.0'dan itibaren, tohum isteğe bağlıdır ve rastgele değerler için varsayılan ayarlar atlanmıştır.

mt_srand() örneği

// mikrosaniye ile tohum
işlev make_seed()
{
list($kullanım, $sn) = patlat(" ", microtime());
dönüş (kayan) $sn + ((kayan) $kullanım * 100000);
}
mt_srand(make_seed());
$randval = mt_rand();
?>

Yorum: PHP 4.2.0'dan itibaren, artık otomatik olarak yapıldığı için rasgele sayı üretecini srand() veya mt_srand() işlevleriyle başlatmak gerekli değildir.

Herkese selam! Bu yazıda, 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, rastgele sayıyı ne için ürettiğinize bağlı olarak, işlev rand() farklı nesil sistemleri kullanır. Şunlar. 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. Bilmek de önemli olan şey, işlevi kullanırsanız rand() içinde PHP 7.1, ardından otomatik olarak üzerine yazılacaktır mt_rand(). Şunlar. 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;

Şunlar. 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.

Ve şimdi hazır şifre oluşturma işlevini alıyoruz ve sitenizin kullanıcıları için yeni bir şifre oluşturmak veya geri yüklemek için bir komut dosyası yazıyoruz.

Şifre kurtarma komut dosyası

Bir komut dosyası genellikle nasıl yazılır?

Her zaman olduğu gibi, adım adım yapmamız gereken adım adım bir şema hazırlanır. Her şey tek bir dosyada olur, hatırlatıcı.php

1. Komut dosyasını yalnızca belirli bir değişken varsa çalıştırın, örneğin $action;

2. Parola oluşturma sürecini başlatmak için kullanıcı $_POST[`ema‘l`] e-posta adresini belirtir; Kodu basitleştirmek için bu değeri $email değişkenine atayalım.

3. Normal ifadeler kullanarak, kullanıcının e-posta adresini doğru bir şekilde belirttiğinden emin olmak için tüm karakterleri kontrol ederiz. Değilse, bir hata görüntüleriz, komut dosyasını durdurun. Her şey doğruysa, devam ederiz.

4. Veritabanında, bizim durumumuzda, kullanıcılar tablosunda, böyle bir posta adresine sahip bir kullanıcı arıyoruz. Değilse, veritabanında böyle bir adres bulunmadığına dair bir hata verir ve betiği durdururuz.

5. Veritabanında böyle bir adrese sahip bir kullanıcı var, devam edin ve yeni bir şifre oluşturma işlevine başlayın. Ayrıca, e-posta adresinde veritabanından benzersiz bir kullanıcı kimliği alıyoruz ve bunu $id değişkenine yazıyoruz;