2010-11-13 32 views
65

¿Hay alguna manera de generar un número aleatorio basado en un mínimo y máximo?Número aleatorio en el rango [min - max] usando PHP

Por ejemplo, si min fue 1 y max 20 debería generar cualquier número entre 1 y 20, incluyendo 1 y 20?

+1

La nueva versión de php tiene un generador de números aleatorios criptográficamente seguro (http://stackoverflow.com/a/31421151/1090562). –

+1

Para PHP 7+ use 'random_int()', 'random_bytes()', o 'openssl_random_pseudo_bytes()'. como @Salvador Dali dijo 'rand()' no genera resultados criptográficamente seguros. Ver documentación http://php.net/manual/en/function.rand.php – FrozenFire

Respuesta

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

pensé que min y max para rand era la cantidad de dígitos para usar en lugar de números :) thnx – Val

+0

Relacionado: si 'PHP_INT_MAX <($ max- $ min) ', debe agregar intervalos juntos, como se describe en [esta respuesta] (http://stackoverflow.com/questions/31252637/what-is-phps-mt-rand-minimum-value-and- how-to-calculate-32-bit-interger-on-32). – bishop

16

Una versión más rápida más rápido usaría mt_rand:

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

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

NOTA: Su servidor necesita tener habilitado el módulo Math PHP para que esto funcione. Si no lo hace, inserte un error en su host para habilitarlo o use el rand normal (y más lento)().

+6

quieres decir más rápido ¿no? la diferencia es (mecanografiar == más rápido vs más rápido == rendimiento sabio) – Val

+2

Sí, más rápido. Corrección válida –

0

Pruebe este. Generará id de acuerdo a tu deseo.

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

En un nuevo PHP7 hay un fin un soporte para un cryptographically secure pseudo-random integers.

int random_int (int $min , int $max) 

random_int - Genera enteros seudo-aleatorios criptográficamente seguros

que básicamente hace que las respuestas anteriores obsoletos .

+1

¡Eso es genial! Pero hasta que los webhosts soporten PHP7 más globalmente, esto no es útil para cualquiera que construya productos para la distribución desafortunadamente.Por lo tanto, las respuestas anteriores que TAMBIÉN funcionan en PHP7 siguen siendo las mejores prácticas. –

+1

@MattCromwell. No estoy de acuerdo contigo. Hasta que los servicios de hosting sean compatibles con PHP7, deberíamos utilizar polyfill para las funciones 'random_int' y' random_bytes' - https://github.com/paragonie/random_compat. –

+0

Tengo curiosidad, ¿hay alguna vez una razón para NO usar 'random_int'? Si proporciona números aleatorios "mejores", ¿por qué no usarlos por razones no criptográficas? –

3

He incluido las respuestas aquí y las he hecho independientes;

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 
} 
Cuestiones relacionadas