2010-11-13 4 views
65

Existe-t-il un moyen de générer un nombre aléatoire basé sur un min et un max? Par exemple, si min était de 1 et de 20 au maximum, il devrait générer n'importe quel nombre entre 1 et 20, y compris 1 et 20?Nombre aléatoire dans la plage [min - max] en utilisant PHP

+1

La nouvelle version de php possède un [générateur de nombres aléatoires] cryptographiquement sécurisé (http://stackoverflow.com/a/31421151/1090562). –

+1

Pour PHP 7+, utilisez 'random_int()', 'random_bytes()', ou 'openssl_random_pseudo_bytes()'. comme le dit @Salvador Dali 'rand()' ne génère pas de résultats cryptographiquement sécurisés. Voir documentation http://php.net/manual/fr/function.rand.php – FrozenFire

Répondre

108
<?php 
    $min=1; 
    $max=20; 
    echo rand($min,$max); 
?> 
+0

Je pensais que min et max pour rand était le nombre de chiffres à utiliser à la place des nombres :) thnx – Val

+0

Connexes: si 'PHP_INT_MAX <($ max- $ min) ', vous devez ajouter des intervalles ensemble, comme décrit dans [cette réponse] (http://stackoverflow.com/questions/31252637/what-is-phps-mt-rand-minimum-value-and- comment-calculer-32-bit-interger-sur-32). – bishop

16

Une version plus rapide plus rapide utiliserait mt_rand:

$min=1; 
$max=20; 
echo mt_rand($min,$max); 

Source: http://www.php.net/manual/en/function.mt-rand.php.

REMARQUE: Votre serveur doit avoir le module Math Math activé pour que cela fonctionne. Si ce n'est pas le cas, boguez votre hôte pour l'activer, ou vous devez utiliser le rand normal (et plus lent).

+6

vous voulez dire plus vite non? la différence est (en tapant == plus rapide vs plus rapide == performance sage) – Val

+2

Oui, plus vite. Correction valide –

0

Essayez celui-ci. Il va générer l'identifiant selon votre souhait.

function id() 
{ 
// add limit 
$id_length = 20; 

// add any character/digit 
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890"; 
$token = ""; 
for($i = 1; $i < $id_length; $i ++) { 

    // generate randomly within given character/digits 
    @$token .= $alfa[rand(1, strlen($alfa))]; 

}  
return $token; 
} 
14

Dans une nouvelle PHP7 il y a un enfin un support pour une cryptographically secure pseudo-random integers.

int random_int (int $min , int $max) 

random_int - Génère cryptographiquement sécurisés entiers pseudo-aléatoires

qui fait essentiellement des réponses précédentes obsolètes .

+1

C'est génial! Mais jusqu'à ce que les hébergeurs supportent PHP7 plus globalement, ceci n'est pas utile pour quiconque construit des produits pour la distribution malheureusement.Donc, les réponses précédentes qui travaillent également sur PHP7 sont toujours les meilleures pratiques. –

+1

@MattCromwell. Je ne suis pas d'accord avec toi. Jusqu'à l'hébergement des services de support PHP7, nous devrions utiliser polyfill pour la fonction 'random_int' et' random_bytes' - https://github.com/paragonie/random_compat. –

+0

Je suis curieux, y a-t-il une raison de ne PAS utiliser 'random_int '? Si cela donne de "meilleurs" nombres aléatoires, pourquoi ne pas l'utiliser pour des raisons non-crypto? –

3

J'ai regroupé les réponses ici et l'ai rendu indépendant de la version;

function generateRandom($min = 1, $max = 20) { 
    if (function_exists('random_int')): 
     return random_int($min, $max); // more secure 
    elseif (function_exists('mt_rand')): 
     return mt_rand($min, $max); // faster 
    endif; 
    return rand($min, $max); // old 
} 
Questions connexes