rand / mt_rand în PHP

Generează un număr întreg aleatoriu. Rapid, dar nesigur pentru parole sau token-uri.

Sintaxă
rand(int $min, int $max): int

Ce face rand / mt_rand

rand și mt_rand returnează un număr întreg între $min și $max, inclusiv. Din PHP 7.1, rand este doar un alt nume pentru mt_rand. Fără parametri, returnează un număr între 0 și mt_getrandmax().

Numerele sunt „pseudo-aleatorii”: cu aceeași valoare de pornire (mt_srand) obții mereu același șir. Este util la teste, dar înseamnă că nu sunt potrivite pentru securitate. Pentru coduri și parole folosește random_int.

Parametri

Parametru Descriere
$min Cea mai mică valoare posibilă.
$max Cea mai mare valoare posibilă.

Ce returnează

Un număr întreg aleatoriu.

Exemple

Exemplul 1: Zar și culoare la întâmplare

Rezultatul diferă la fiecare rulare.

<?php
echo "Zar: " . mt_rand(1, 6) . "\n";
echo "Culoare: rgb(" . rand(0, 255) . ", " . rand(0, 255) . ", " . rand(0, 255) . ")";

Rezultat posibil (diferă la fiecare rulare)

Zar: 5
Culoare: rgb(34, 187, 92)

Exemplul 2: Același șir cu aceeași valoare de pornire

După mt_srand(42), șirul de numere este mereu același, pe orice server.

<?php
mt_srand(42);
$primul = [mt_rand(1, 100), mt_rand(1, 100), mt_rand(1, 100)];

mt_srand(42);
$alDoilea = [mt_rand(1, 100), mt_rand(1, 100), mt_rand(1, 100)];

var_dump($primul === $alDoilea);

Rezultat

bool(true)

Greșeli frecvente

  • Generezi coduri de resetare a parolei cu rand sau mt_rand. Un atacator le poate ghici. Folosește random_int sau random_bytes.
  • Dai $min mai mare decât $max. În PHP 8 primești ValueError la mt_rand.

Comenzi înrudite

  • random_int: Generează un număr întreg aleatoriu, sigur, între două valori.
  • array_rand: Alege una sau mai multe chei la întâmplare dintr-un tablou.
  • shuffle: Amestecă elementele unui tablou într-o ordine aleatorie.