Nomor acak di php. Menggunakan fungsi acak PHP

Untuk menghasilkan angka acak, Anda dapat menggunakan fungsi PHP rand() atau mt_rand(). Persyaratan untuk menggunakan angka acak sering kali muncul dalam praktik untuk memberi nama variabel, file, membuat informasi penting, dan memastikan keamanan.

Keacakan dan keunikan

Fungsi acak PHP hadir dalam dua varian: rand() dan mt_rand(). Dipercayai bahwa algoritma dalam kasus pertama lebih sederhana dan menghasilkan angka pseudorandom. Opsi kedua memiliki algoritma yang lebih cepat dan karakteristik matematika yang terkenal. Dalam kebanyakan kasus ketika Anda perlu mendapatkan nomor acak, Anda dapat menggunakan serangkaian panggilan acak PHP dan mendapatkan kombinasi angka yang unik.

Jika Anda mengambil angka dari 1 hingga 26 atau dari 1 hingga 32 sebagai dasar dan mendapatkannya secara acak, Anda dapat membentuk informasi penting dalam bentuk rangkaian huruf Latin atau Sirilik. Dalam hal ini, PHP random adalah cara menghasilkan rangkaian informasi alfabet, misalnya untuk keperluan pengujian saluran komunikasi atau algoritma.

Suatu bilangan acak jarang bersifat unik karena dapat muncul berkali-kali menurut hukum distribusi variabel acak. Tetapi jika Anda menggabungkan, khususnya, variabel statis PHP & Math.random dari bahasa JavaScript, Anda bisa mendapatkan nomor acak unik yang nyata yang tidak akan terulang seiring waktu.

Menggunakan Fungsi Waktu

Fungsi waktu, baik PHP maupun JavaScript, memungkinkan Anda membentuk kombinasi angka yang unik, jarang terjadi peristiwa dalam jumlah yang cukup besar dapat terjadi pada satu titik waktu dan variabel acak akan berulang.

Dengan menerapkan PHP acak dalam rentang detik atau milidetik pada rentang nilai yang besar, dimungkinkan untuk memperoleh kombinasi angka atau huruf acak yang unik. Apa lagi?

Dengan menggabungkan nilai fungsi waktu, angka yang bertambah secara berurutan, dan PHP acak, Anda dapat memastikan keamanan saluran komunikasi klien dan server yang andal, membuat kode unik untuk variabel, dan menghasilkan kejadian tak terduga dalam algoritme.

Generator nomor acak PHP adalah solusi terbaik untuk sebagian besar tugas, terutama ketika Anda perlu mendapatkan hasil berkualitas tinggi dengan cepat dan sedikit usaha. Menggunakan fungsi rand() dan mt_rand bersama dengan rangkaian angka atau nilai waktu yang bertambah secara berurutan memungkinkan Anda memperoleh angka acak, baik nilai yang berulang maupun unik.

Tugas
Anda perlu membuat nomor acak dalam rentang numerik.

Larutan
Fungsi mt_rand() dirancang untuk ini:

// nomor acak antara $upper dan $lower, inklusif
$angka_acak = mt_rand($bawah, $atas);

Diskusi
Pembuatan angka acak berguna ketika Anda perlu menampilkan gambar acak di layar, menetapkan titik awal permainan secara acak, memilih entri acak dari database, atau membuat pengidentifikasi sesi unik. Untuk menghasilkan angka acak dalam interval antara dua titik, Anda perlu meneruskan dua argumen ke fungsi mt_rand():

$angka_acak = mt_rand(1, 100);

Memanggil mt_rand() tanpa argumen akan mengembalikan angka antara nol dan angka acak maksimum yang dikembalikan oleh mt_getrandmax(). Sulit bagi komputer untuk menghasilkan angka yang benar-benar acak. Dia jauh lebih baik dalam mengikuti instruksi secara metodis dan tidak begitu baik jika dia diharuskan bertindak secara spontan. Jika Anda perlu memaksa komputer untuk menghasilkan angka acak, maka Anda perlu memberinya serangkaian perintah tertentu yang dapat diulang, dan fakta bahwa komputer dapat diulang membuat kemungkinan terjadinya keacakan menjadi lebih kecil.

PHP memiliki dua generator angka acak yang berbeda: fungsi klasik yang disebut rand() dan fungsi lebih lanjut mt_rand().

MT (Mersenne Twister) adalah generator bilangan acak semu yang dinamai biksu dan matematikawan Perancis Marin Mersenne, yang mempelajari bilangan prima. Algoritma generator ini didasarkan pada bilangan prima ini. Fungsi mt_rand() lebih cepat dibandingkan fungsi rand() dan menghasilkan lebih banyak angka acak, jadi kami lebih memilih yang pertama.

Jika Anda memiliki versi PHP lebih awal dari 4.2, maka sebelum memanggil fungsi mt_rand() (atau rand()) untuk pertama kalinya, Anda perlu menginisialisasi generator dengan nilai awal dengan memanggil mt_srand() (atau srand( )) fungsi. Seed adalah angka yang digunakan fungsi acak sebagai dasar untuk menghasilkan angka acak yang dikembalikannya; ini mengacu pada cara untuk menyelesaikan dilema yang disebutkan di atas – keterulangan versus keacakan.

Sebagai nilai awal yang berubah sangat cepat dan dengan kemungkinan pengulangan yang rendah (properti ini harus mencirikan nilai awal yang baik), Anda dapat mengambil nilai yang dikembalikan oleh fungsi waktu presisi tinggi microtime(). Cukup menginisialisasi generator satu kali. PHP 4.2 dan yang lebih baru secara otomatis menangani inisialisasi, tetapi jika nilai awal diatur secara manual sebelum panggilan pertama ke mt_rand(), PHP tidak menggantinya dengan nilai awalnya sendiri.

Jika Anda perlu memilih rekaman acak dari database, cara termudah adalah dengan terlebih dahulu menentukan jumlah total bidang dalam tabel, memilih nomor acak dari rentang tersebut, lalu menanyakan baris tersebut dari database:

$sth = $dbh->query("SELECT COUNT(*) SEBAGAI hitungan DARI tanda kutip");
if ($baris = $sth->fetchRow()) (
$hitungan = $baris;
) kalau tidak (
mati ($baris->getMessage());
}
$acak = mt_rand(0, $hitung - 1);
$sth = $dbh->query("PILIH kutipan DARI tanda kutip LIMIT $random,1");
while ($baris = $sth->fetchRow()) (
cetak $baris .

"\N";
}

Cuplikan kode ini menentukan jumlah total baris dalam tabel, menghasilkan angka acak dari rentang tersebut, lalu menggunakan LIMIT $random,1 untuk SELECT satu baris dari tabel yang dimulai dari posisi $random. Di MySQL versi 3.23 atau lebih tinggi, opsi alternatif dimungkinkan:

$sth = $dbh->query("PILIH kutipan DARI tanda kutip ORDER BY RAND() LIMIT 1");
while ($baris = $sth->fetchRow()) (
cetak $baris . "\N";
}

Dalam hal ini, MySQL mengacak baris terlebih dahulu, lalu mengembalikan baris pertama.

Menginisialisasi generator nomor acak. Sintaksis:

Batalkan pasir (int benih)

Menginisialisasi generator nomor acak dengan nilai benih.

Srand((ganda) waktu mikro()*1000000);
$acak = acak();
gema $acak;

DAPATKANMAX

Mengembalikan angka acak sebesar mungkin. Sintaksis:

ke dalam getrandmax()

Fungsi ini mengembalikan nilai maksimum yang dapat diperoleh dengan menggunakan fungsi pembuatan angka acak rand().

Biasanya 32767

Menghasilkan nomor acak. Sintaksis:

ke dalam Rand()

Saat dipanggil dengan parameter opsional min dan max, fungsi ini menghasilkan angka acak hingga dan termasuk parameter tersebut. Jika parameter min dan max tidak ada, angka mulai dari 0 hingga RAND_MAX akan dikembalikan.

Agar fungsi ini berfungsi dengan benar, sebelum menggunakannya, Anda perlu menginisialisasi penghasil angka acak dengan fungsi srand().

lcg_nilai()

Generator nomor pseudo-acak LCG (PHP 4, PHP 5)

Keterangan:

Nilai_lcg_mengambang (batal)

lcg_value() mengembalikan nomor pseudorandom dalam rentang (0, 1). Fungsi tersebut menggabungkan dua generator dengan 2^31 - 85 dan 2^31 - 249 dalam satu periode.

mt_getrandmax()

Menampilkan nilai acak terbesar yang mungkin (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Keterangan:

Ke dalam mt_getrandmax (batal)

Menampilkan nilai maksimum yang dapat dikembalikan oleh mt_rand()

mt_rand()

Menghasilkan nilai acak terbaik (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Keterangan:

ke dalam mt_rand()

Banyak generator nomor acak versi lama memiliki karakteristik yang meragukan dan lambat. Secara default, PHP menggunakan fungsi rand() untuk menghasilkan angka acak. Fungsi mt_rand() adalah pengganti yang baik. Ia menggunakan generator angka acak yang 4 kali lebih cepat dari rand() dan menggunakan Mersenne Twister.

Dipanggil tanpa argumen opsional min dan max, mt_rand() mengembalikan nilai pseudo-acak yang berkisar antara 0 dan RAND_MAX. Jika Anda perlu mendapatkan, misalnya, nilai acak antara 5 dan 15 inklusif, carilah mt_rand (5, 15).

Contoh penggunaan mt_rand()

Hasil dari menjalankan contoh ini akan menjadi seperti ini:

1604716014
1478613278
6

Komentar

Catatan: Pada versi sebelum 3.0.7, parameter kedua dari fungsi tersebut menentukan rentang angka. Misalnya, untuk mendapatkan angka acak antara 5 dan 15 pada versi ini, Anda perlu menentukan fungsi mt_rand(5, 11).

mt_srand()

Menetapkan nilai awal penghasil angka acak terbaik (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Keterangan:

Batalkan mt_srand()

Menetapkan nilai awal generator angka acak menggunakan seed. Pada PHP 4.2.0, seed bersifat opsional dan pengaturan default untuk nilai acak dihilangkan.

Contoh penggunaan mt_srand()

Catatan: Mulai PHP 4.2.0, tidak perlu lagi menginisialisasi penghasil angka acak dengan srand() atau mt_srand(), karena ini sekarang dilakukan secara otomatis.

Secara teknis, istilah "penghasil bilangan acak" tidak masuk akal, karena bilangan itu sendiri tidak acak. Misalnya, apakah 100 merupakan bilangan acak? Bagaimana dengan 25? Arti sebenarnya dari istilah ini adalah menciptakan rangkaian angka yang muncul secara acak. Hal ini menimbulkan pertanyaan yang lebih sulit: apa yang dimaksud dengan barisan bilangan acak? Satu-satunya jawaban yang benar: barisan bilangan acak adalah barisan yang semua unsurnya tidak berhubungan. Definisi ini mengarah pada paradoks bahwa barisan apa pun dapat bersifat acak atau non-acak, bergantung pada bagaimana barisan tersebut diperoleh. Misalnya rangkaian angka berikut
1 2 3 4 5 6 7 8 9 0
diperoleh dengan mengetikkan baris teratas keyboard secara berurutan, sehingga urutannya tidak dapat dianggap dihasilkan secara acak. Namun bagaimana jika Anda mendapatkan urutan yang sama saat Anda mengeluarkan bola tenis bernomor dari tongnya. Dalam hal ini, ini sudah merupakan urutan yang dihasilkan secara acak. Contoh ini menunjukkan bahwa keacakan suatu barisan bergantung pada cara memperolehnya, dan bukan pada barisan itu sendiri.

Ingatlah bahwa rangkaian angka yang dihasilkan komputer bersifat deterministik: setiap angka kecuali angka pertama bergantung pada angka sebelumnya. Secara teknis, ini berarti bahwa hanya rangkaian angka kuasi-acak yang dapat dihasilkan oleh komputer, yaitu. sebenarnya mereka tidak benar-benar acak. Namun, ini cukup untuk sebagian besar tugas dan untuk kesederhanaan, urutan seperti itu akan disebut acak. Salah satu metode yang sangat menarik dikembangkan oleh John von Neumann; ini sering disebut root mean square. Dalam metode ini, bilangan acak sebelumnya dikuadratkan, lalu digit tengahnya diekstraksi dari hasilnya. Misalnya, jika Anda membuat bilangan dengan tiga digit, dan bilangan sebelumnya adalah 121, maka mengkuadratkan hasilnya akan menghasilkan 14641. Mengkuadratkan tiga digit di tengah akan menghasilkan bilangan acak berikutnya 464. Kerugian dari metode ini adalah metode ini memiliki periode pengulangan yang sangat singkat, disebut siklus. Oleh karena itu, metode ini tidak digunakan saat ini. Metode modern untuk menghasilkan angka acak jauh lebih kompleks.

Angka acak di PHP

PHP memiliki dua kelompok fungsi untuk bekerja dengan angka acak. Secara lahiriah, mereka dapat dibedakan dengan awalan mt_ untuk semua fungsi salah satu grup.

Fitur yang tidak digunakan lagi
fungsi acak Mengembalikan bilangan bulat antara nol dan nilai RAND_MAX (yaitu 32767). Dapat memiliki dua parameter bilangan bulat opsional - jika ditentukan, nomor acak akan dihasilkan dari parameter pertama hingga parameter kedua.

Gema Rand(); gema rand(1,100); // Berikan nomor acak dari 1 hingga 100

Fungsi pasir. Menentukan urutan angka acak yang dihasilkan oleh fungsi rand. Ia memiliki seluruh parameter - untuk nilai berbeda dari parameter ini, rand akan menghasilkan urutan angka yang berbeda. Fungsi srand hanya perlu dipanggil satu kali sebelum semua pemanggilan ke fungsi rand. Contoh penggunaan:

Sand(1288); // Inisialisasi penghasil angka acak untuk($i=0; $i