Número aleatorio en el rango [mínimo - máximo] usando PHP

84

¿Hay alguna forma de generar un número aleatorio basado en un mínimo y un máximo?

Por ejemplo, si el mínimo era 1 y el máximo 20, debería generar cualquier número entre 1 y 20, incluidos 1 y 20.

Val
fuente
1
La nueva versión de php tiene un generador de números aleatorios criptográficamente seguro .
Salvador Dali
1
Para el uso de PHP 7+ random_int(), random_bytes()o openssl_random_pseudo_bytes() . como dijo @Salvador Dali rand()no generan resultados criptográficamente seguros. Ver documentación php.net/manual/en/function.rand.php
FrozenFire

Respuestas:

147
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>
Prisionero
fuente
Pensé que el mínimo y el máximo para rand era la cantidad de dígitos a usar en lugar de números :) thnx
Val
Relacionado: si PHP_INT_MAX < ($max-$min), necesita sumar intervalos juntos, como se describe en esta respuesta .
obispo
rand () antes de PHP7.1 es simplemente malo. Utiliza el algoritmo LCG que da como resultado una salida predecible. También es lento. Dado que PHP7.1 rand () se convierte en un alias de mt_rand (), ya no está mal. PHP7 también introdujo random_int () criptográficamente seguro, sin embargo, debe evitarse a menos que sea esencial, ya que es mucho más lento que mt_rand ()
xZero
34

En un nuevo PHP7 hay finalmente un soporte para enteros pseudoaleatorios criptográficamente seguros.

int random_int ( int $min , int $max )

random_int - Genera enteros pseudoaleatorios criptográficamente seguros

lo que básicamente hace obsoletas las respuestas anteriores.

Salvador Dalí
fuente
2
¡Eso es genial! Pero hasta que los servidores web admitan PHP7 de manera más global, esto no es útil para nadie que desarrolle productos para su distribución. Entonces, las respuestas anteriores que TAMBIÉN funcionan en PHP7 siguen siendo las mejores prácticas.
Matt Cromwell
1
@MattCromwell. No estoy de acuerdo contigo. Hasta que los servicios de apoyo de alojamiento PHP7 debemos utilizar para polyfill random_inty random_bytesfunción - github.com/paragonie/random_compat .
Vladimir Posvistelik
Tengo curiosidad, ¿alguna vez hay alguna razón para NO usar random_int ? Si da números aleatorios "mejores", ¿por qué no usarlo por razones no criptográficas?
Brian Leishman
1
@BrianLeishman Prefiero usarlo para todo. El único inconveniente que puedo adivinar: probablemente se basa en la fuente de la aleatoriedad y podría fallar si está fuera de la aleatoriedad. Puede que sea más caro (es necesario comprobarlo) pero dudo que esta función haga una gran diferencia
Salvador Dali
Sé que es más lento, pero es lo suficientemente insignificante como para no volver atrás y cambiar las random_intsa existentes por rands. Además, mi caso de uso es un algoritmo de reintento, y definitivamente no quiero que se agrupen múltiples funciones fallidas después de dormir debido a entradas aleatorias predecibles
Brian Leishman
19

Una versión más rápida 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 es así, inserte un error en su host para que lo habilite, o tendrá que usar el rand () normal (y más lento).

Matt Cromwell
fuente
6
quieres decir más rápido, ¿verdad? la diferencia es (escribiendo == más rápido vs más rápido == en cuanto al rendimiento)
Val
english.stackexchange.com/questions/31732/… - en realidad pueden ser ambos
pee2pee
6

He agrupado las respuestas aquí y la he hecho independiente de la versión;

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
}
vonUbisch
fuente
0

Prueba este. Generará una identificación de acuerdo con su 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;
}
asi_x
fuente