Vous avez besoin d’un nombre aléatoire PHP pour faire un tirage au sort, générer un jeton de sécurité, mélanger des cartes, ou simplement ajouter un peu de hasard à votre projet. Et là, vous tapez “random PHP”, vous tombez sur rand(), ça marche… et vous vous dites : “Bon, c’est réglé.” Sauf qu’en réalité, tout dépend de ce que vous appelez “vrai”. Parce qu’entre un nombre “qui a l’air aléatoire” et un nombre “vraiment imprévisible”, il y a un monde.
- Comprendre la différence entre un hasard “qui semble vrai” et un hasard réellement fiable, pour éviter les mauvais choix dans vos projets PHP.
- Savoir générer des nombres imprévisibles et robustes, utilisables aussi bien pour des mini-jeux que pour des besoins sérieux comme des codes de validation.
- Repartir avec des exemples concrets et réutilisables immédiatement, pour intégrer du hasard proprement dans vos scripts sans vous compliquer la vie.
Dans ce tutoriel, on va justement apprendre à générer un vrai nombre aléatoire en PHP, en partant de zéro, avec des exemples concrets, du code simple, et surtout les bons réflexes.
- Comprendre ce que veut dire “vrai aléatoire”
- Les erreurs classiques avec les nombres aléatoires en PHP
- Le bon réflexe en 2026 : random_int() pour un nombre aléatoire PHP sécurisé
- Quand utiliser rand() et quand utiliser random_int() ?
- Exemple concret : faire un dé réellement aléatoire
- Exemple concret : tirage au sort d’un participant
- Comprendre random_bytes() : la base du hasard “brut” en PHP
- Exemple concret : générer un token sécurisé pour un lien
- Attention : “nombre aléatoire” et “token” ne sont pas la même chose
- Exemple concret : générer un code à 6 chiffres (type SMS)
- Mélanger un tableau : surtout ne réinventez pas la roue
- Un vrai hasard, c’est aussi une question de distribution
- Les bonnes pratiques à retenir que vous utiliserez tout le temps
- Une fonction maison et propre pour un vrai nombre aléatoire PHP
- Le vrai hasard en PHP, c’est surtout une bonne décision
Comprendre ce que veut dire “vrai aléatoire”
Commençons par une phrase très importante : dans un ordinateur, le hasard n’existe pas vraiment.
Un ordinateur calcule. Il applique des règles. Donc, s’il génère un nombre “au hasard”, c’est souvent parce qu’il utilise une recette mathématique qui donne une suite de nombres qui semble aléatoire.
Ce type de hasard porte un nom : le pseudo-aléatoire.
Pseudo-aléatoire : ça “fait illusion”, mais ce n’est pas imprévisible
Un générateur pseudo-aléatoire fonctionne comme une machine à produire des nombres qui ont l’air d’être tirés au hasard. Le problème, c’est que si on connaît son point de départ, on peut retrouver la suite.
Le point de départ, en programmation, on l’appelle la graine (seed).
Imaginez une roulette de casino truquée : elle tourne, elle semble imprévisible, mais en réalité elle suit une logique. C’est exactement l’idée.
Vrai aléatoire : imprévisible même si on observe
Quand on parle d’un “vrai nombre aléatoire”, on parle plutôt d’un nombre imprévisible, même si quelqu’un tente de deviner comment vous l’avez généré.
Et en PHP, pour obtenir ce niveau-là, il faut utiliser des fonctions basées sur des sources d’entropie solides du système, typiquement :
random_int()random_bytes()
Autrement dit : le “vrai aléatoire” en PHP, ce n’est pas une magie… c’est surtout une question de sécurité et d’imprévisibilité.
Les erreurs classiques avec les nombres aléatoires en PHP
Avant de vous montrer les bonnes fonctions, il faut comprendre pourquoi les anciennes peuvent poser problème.
rand() : l’ancienne méthode (souvent utilisée, rarement idéale)
Vous verrez partout ce code :
$nombre = rand(1, 10);
echo $nombre;Oui, ça donne un nombre entre 1 et 10. Et pour un mini-jeu sans enjeu, ça peut suffire.
Mais rand() a deux défauts :
- Ce n’est pas fait pour de la sécurité.
- Selon la version de PHP et la plateforme, la qualité peut varier.
Vous pouvez vous retrouver avec un résultat exploitable ou prévisible dans certains contextes.
mt_rand() : mieux, mais pas “vraiment sûr”
mt_rand() est souvent présenté comme une version améliorée de rand(). Il est basé sur l’algorithme Mersenne Twister, très performant :
$nombre = mt_rand(1, 10);
echo $nombre;Il est meilleur en termes de distribution et de performance, mais il reste pseudo-aléatoire. Donc, pour un token, un reset password, un code de validation, ce n’est pas une bonne idée.
Et là, on arrive au vrai sujet.
Le bon réflexe en 2026 : random_int() pour un nombre aléatoire PHP sécurisé
Si vous ne deviez retenir qu’une seule fonction de cet article, ce serait celle-là :
✅ random_int(min, max)
Elle génère un nombre aléatoire PHP sûr, adapté à la sécurité, et surtout très simple à utiliser.
Exemple basique : un nombre entre 1 et 100
$nombre = random_int(1, 100);
echo $nombre;C’est propre, lisible, et vous pouvez déjà l’utiliser dans presque tous vos projets.
Pourquoi random_int() est considéré comme “vrai aléatoire” ?
Techniquement, il s’appuie sur le générateur cryptographique du système. Donc il produit des nombres impossibles à deviner “logiquement” comme avec un pseudo-aléatoire classique.
C’est exactement ce qu’on veut quand on cherche un vrai nombre aléatoire en PHP.
Petit point important : gérer les erreurs proprement
random_int() peut lancer une exception si le système ne peut pas fournir assez d’entropie (rare, mais possible). Donc dans un code sérieux, on encapsule ça :
try {
$nombre = random_int(1, 100);
echo $nombre;
} catch (Exception $e) {
echo "Erreur lors de la génération du nombre aléatoire.";
}Ce n’est pas forcément obligatoire pour une démo, mais dans un vrai site, c’est un bon réflexe.
Quand utiliser rand() et quand utiliser random_int() ?
On va simplifier avec une règle très claire.
- Si vous faites du “fun” :
rand()oumt_rand()peuvent suffire. - Si vous faites du “sérieux” :
random_int()est la bonne réponse.
Voici des situations où il faut absolument préférer random_int() :
- Tirage de gagnants d’un concours (si vous voulez éviter toute contestation)
- Création d’un code promo unique
- Génération d’un code de vérification par mail
- Jeton anti-CSRF
- ID public difficile à deviner
- Token de réinitialisation de mot de passe
Autrement dit : dès qu’il y a un enjeu, même petit, le nombre aléatoire PHP doit être solide.
Pour aller plus loin : Créer un token en PHP
Exemple concret : faire un dé réellement aléatoire
Un classique, mais parfait pour comprendre.
$de = random_int(1, 6);
echo "Vous avez fait : " . $de;C’est simple, mais déjà intéressant.
Maintenant, ajoutons une logique pour afficher un message :
$de = random_int(1, 6);
if ($de === 6) {
echo "Critique ! Vous avez fait un 6 !";
} else {
echo "Vous avez fait : $de";
}Vous voyez ? On utilise le hasard comme un vrai outil de gameplay ou d’interactivité.
Exemple concret : tirage au sort d’un participant
Imaginez que vous avez une liste de participants à un concours.
$participants = ["Alban", "Julie", "Franck", "Nina", "Thomas"];Vous voulez en choisir un au hasard.
On récupère un index aléatoire :
$index = random_int(0, count($participants) - 1);
$gagnant = $participants[$index];
echo "Le gagnant est : " . $gagnant;Ce petit code, vous pouvez déjà le mettre dans un projet réel. Et surtout, il repose sur un vrai hasard fiable.
Pour un tirage au sort, si vous utilisez rand()… un même prénom peut revenir plus souvent que les autres. Pas forcément parce que c’est truqué, mais parce que le hasard pseudo-aléatoire peut donner des séries surprenantes. Résultat, les participants commenceront à lever un sourcil. “C’est bizarre quand même…”
Alors que le code est honnête, l’impression humaine, elle, ne l’est pas : nous, on déteste quand le hasard fait trop souvent “toujours pareil”. Et c’est là qu’on réalise que générer un nombre aléatoire PHP n’est pas qu’un détail technique : c’est aussi une question de confiance.
Comprendre random_bytes() : la base du hasard “brut” en PHP
Si random_int() vous donne un nombre, random_bytes() vous donne des octets aléatoires.
Exemple :
$bytes = random_bytes(16);
echo bin2hex($bytes);Ici, on génère 16 octets (128 bits). Ensuite on les transforme en hexadécimal pour l’afficher.
Vous obtenez un résultat du style :
a3f19c7b2d1e9f4c8a2b7d0f5c1a9e22Pourquoi c’est utile ?
Parce que pour générer un token de sécurité, c’est parfait.
Exemple concret : générer un token sécurisé pour un lien
Vous voulez créer un lien du type : https://monsite.fr/reset-password.php?token=…
Voici un token robuste :
$token = bin2hex(random_bytes(32));
echo $token;Ça vous produit 64 caractères hexadécimaux, avec une entropie très élevée.
L’entropie, c’est un peu la mesure du désordre ou du « bazar » dans un système. Imagine une chambre parfaitement rangée : son entropie est basse. Si tu laisses les vêtements traîner et les livres s’éparpiller, le désordre augmente, et donc l’entropie aussi. En sciences, cela signifie que l’énergie a naturellement tendance à s’éparpiller au lieu de rester concentrée et organisée. C’est pour cela qu’il est très facile de casser un œuf (passer de l’ordre au désordre), mais qu’il est impossible qu’il se répare tout seul : l’univers préfère toujours évoluer vers l’état le plus mélangé et le plus désordonné possible.
Ensuite, vous le stockez en base de données (avec une date d’expiration), et vous envoyez le lien à l’utilisateur. Et là, on est dans le vrai monde du web moderne.

Des formations informatique pour tous !
Débutant ou curieux ? Apprenez le développement web, le référencement, le webmarketing, la bureautique, à maîtriser vos appareils Apple et bien plus encore…
Formateur indépendant, professionnel du web depuis 2006, je vous accompagne pas à pas et en cours particulier, que vous soyez débutant ou que vous souhaitiez progresser. En visio, à votre rythme, et toujours avec pédagogie.
Découvrez mes formations Qui suis-je ?Attention : “nombre aléatoire” et “token” ne sont pas la même chose
Un nombre aléatoire PHP, c’est parfait pour :
- 1 à 100
- 0 à 9999
- un indice dans un tableau
Un token, lui, doit être :
- long
- impossible à deviner
- unique
- utilisable comme clé temporaire
Donc pour un token, random_bytes() est souvent le meilleur choix, pas random_int(). Mais les deux sont complémentaires.
Exemple concret : générer un code à 6 chiffres (type SMS)
Ici, on veut un code comme “493821”.
Sauf que petit piège : si vous faites random_int(0, 999999), vous pouvez obtenir un nombre avec moins de 6 chiffres comme “42”.
Donc il faut ajouter un remplissage avec des zéros.
$code = random_int(0, 999999);
$codeFormate = str_pad((string)$code, 6, "0", STR_PAD_LEFT);
echo $codeFormate;Résultat : toujours 6 chiffres, même si vous tirez 42, ça devient “000042”.
Et ça, c’est typiquement le genre de détail qui fait “pro” quand vous créez un vrai système.
Mélanger un tableau : surtout ne réinventez pas la roue
Quand on veut “du hasard”, beaucoup de gens codent des boucles compliquées… alors qu’en PHP, il existe shuffle().
$cartes = ["As", "Roi", "Dame", "Valet", "10"];
shuffle($cartes);
print_r($cartes);Ça mélange le tableau.
Est-ce que c’est cryptographiquement parfait ? Non. Mais pour un affichage aléatoire simple (ex : “afficher 3 exercices au hasard”), c’est largement suffisant.
Un vrai hasard, c’est aussi une question de distribution
Un bon générateur doit produire un hasard “bien réparti”. Si vous tirez 10 000 fois un nombre entre 1 et 10, vous devriez avoir environ :
- 1000 fois “1”
- 1000 fois “2”
- etc.
Pas exactement, mais à peu près.
Pour aller plus loin : Maths et développement web, comprendre la distribution.
Mini test de distribution en PHP (simple et instructif)
Voici un script qui compte combien de fois chaque valeur sort :
$resultats = array_fill(1, 10, 0);
for ($i = 0; $i < 10000; $i++) {
$n = random_int(1, 10);
$resultats[$n]++;
}
print_r($resultats);Si vous lancez ça, vous verrez une répartition assez équilibrée.
C’est un excellent exercice pour débuter et comprendre ce qu’est une “distribution”.
Les bonnes pratiques à retenir que vous utiliserez tout le temps
Quand vous travaillez avec un nombre aléatoire PHP, gardez ces habitudes :
- Ne jamais utiliser
rand()pour la sécurité : Même si ça marche, même si ça “fait le boulot”, même si vous êtes pressé… évitez. Le jour où vous vous faites deviner un token ou un code, vous repenserez à cette phrase. - Utiliser
random_int()par défaut pour les tirages sérieux : C’est simple, efficace, et vous évite d’avoir à réfléchir pendant 20 minutes. - Utiliser
random_bytes()pour les tokens et identifiants solides : Un token doit être long et imprévisible.random_bytes()est parfaitement adapté.
Et côté performance, ça donne quoi ?
Très honnêtement : pour 99% des sites, la différence est négligeable.
Oui, random_int() est un peu plus “lourd” que mt_rand().
Mais si vous générez 10 nombres aléatoires par page, vous ne verrez rien.
La vraie question n’est pas “est-ce rapide ?”
La vraie question, c’est : “est-ce sûr ? est-ce fiable ?”
Et sur ce point, random_int() gagne.
Une fonction maison et propre pour un vrai nombre aléatoire PHP
<?php
/**
* Génère un vrai nombre aléatoire en PHP (imprévisible et sécurisé)
* entre $min et $max.
*
* @param int $min Valeur minimum
* @param int $max Valeur maximum
* @return int Nombre aléatoire sécurisé
* @throws Exception Si la génération échoue
*/
function vraiNombreAleatoire(int $min, int $max): int
{
// Petite sécurité : si l'utilisateur inverse min et max, on corrige.
if ($min > $max) {
$temp = $min;
$min = $max;
$max = $temp;
}
// Si min et max sont égaux, inutile de générer quoi que ce soit.
if ($min === $max) {
return $min;
}
// random_int() est la meilleure fonction PHP pour un nombre aléatoire fiable
return random_int($min, $max);
}Exemple d’utilisation :
echo vraiNombreAleatoire(1, 100);Ça affichera un nombre entre 1 et 100, et vous pouvez recharger la page autant que vous voulez.
Explication ligne par ligne
1) La signature de la fonction
function vraiNombreAleatoire(int $min, int $max): intIci, on dit :
- la fonction s’appelle
vraiNombreAleatoire - elle reçoit 2 nombres entiers (
$minet$max) - et elle retourne un entier (
: int)
C’est propre, clair, et ça évite plein de bugs.
Pour les débutants : Paramètre de fonction et retour
2) Gérer le cas où l’utilisateur se trompe
if ($min > $max) {
$temp = $min;
$min = $max;
$max = $temp;
}Parfois, on appelle la fonction comme ça par erreur :
vraiNombreAleatoire(100, 1);Sans correction, ça ferait planter ou provoquer un comportement inattendu.
Donc on inverse les valeurs. C’est une “protection” sympa, typiquement ce qu’on attend d’une fonction maison.
3) Si min = max, on retourne directement
if ($min === $max) {
return $min;
}Si vous demandez un nombre entre 5 et 5… il n’y a pas de hasard possible.
Donc on retourne 5, et on évite de faire travailler PHP pour rien.
4) Le cœur : le “vrai nombre aléatoire” PHP
return random_int($min, $max);C’est LA ligne la plus importante.
random_int() est une fonction moderne qui génère un nombre :
- imprévisible
- fiable
- adapté à la sécurité
- basé sur une source d’entropie du système
C’est pour ça qu’on peut dire que c’est un vrai nombre aléatoire PHP (dans le sens où personne ne peut le deviner).
Si vous aviez fait :
return rand($min, $max);Ça fonctionnerait… mais c’est pseudo-aléatoire, donc “imitant” le hasard.
Alors que :
return random_int($min, $max);c’est le bon réflexe moderne.
Bonus : version “je ne veux jamais d’exception” (optionnel)
Parfois, vous ne voulez pas que le site plante même en cas de problème rare.
Voici une version plus “tolérante” :
function vraiNombreAleatoireSafe(int $min, int $max): int
{
if ($min > $max) {
[$min, $max] = [$max, $min];
}
if ($min === $max) {
return $min;
}
try {
return random_int($min, $max);
} catch (Exception $e) {
// Plan B : on utilise un fallback moins sécurisé
return mt_rand($min, $max);
}
}Celle-ci est utile si vous préférez “un résultat moins parfait plutôt qu’un crash”.
Le vrai hasard en PHP, c’est surtout une bonne décision
Générer un vrai nombre aléatoire PHP, ce n’est pas juste un détail technique pour faire joli. C’est un choix qui peut rendre votre site plus crédible, plus robuste, et parfois même plus sécurisé.
Ce qui est rassurant, c’est qu’en PHP moderne, vous n’avez pas besoin d’être un expert en cryptographie pour faire les choses bien. En réalité, vous avez déjà les outils parfaits sous la main : random_int() pour des nombres, et random_bytes() pour des tokens solides.
Et si vous deviez garder une philosophie simple pour la suite, ce serait celle-ci : quand le hasard a un enjeu, même petit, on ne fait pas “à peu près”. On fait correctement, calmement, et avec les bons outils. C’est exactement comme ça qu’on progresse en développement web : un réflexe propre après l’autre, jusqu’à ce que ça devienne naturel.

Fondateur de l’agence Créa-troyes, affiliée France Num
Intervenant en Freelance.
Contactez-moi
