Número aleatorio en rango [min – max] usando PHP

4 minutos de lectura

avatar de usuario
valle

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

Por ejemplo, si min fuera 1 y max 20, debería generar cualquier número entre 1 y 20, incluidos 1 y 20.

  • La nueva versión de php tiene un generador de números aleatorios criptográficamente seguro.

    – Salvador Dalí

    15 de julio de 2015 a las 3:47

  • Para uso de PHP 7+ random_int(), random_bytes()o openssl_random_pseudo_bytes() . como dijo @Salvador Dali rand() no genera resultados criptográficamente seguros. Ver documentación php.net/manual/en/function.rand.php

    – Fuego Congelado

    23 de enero de 2016 a las 8:56


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

  • pensé que min y max para rand era la cantidad de dígitos a usar en lugar de números 🙂 gracias

    – Vale

    13 de noviembre de 2010 a las 17:50

  • Relacionado: si PHP_INT_MAX < ($max-$min)debe agregar intervalos, como se describe en esta respuesta.

    – obispo

    10 de julio de 2015 a las 16:12


  • 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(), por lo tanto, ya no es malo. 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()

    – x cero

    13 de diciembre de 2018 a las 9:17

en un nuevo PHP7 finalmente hay un soporte para un 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 que las respuestas anteriores queden obsoletas.

  • ¡Eso es genial! Pero hasta que los servidores web admitan PHP7 de manera más global, esto no es útil para nadie que cree productos para su distribución, lamentablemente. Entonces, las respuestas anteriores que TAMBIÉN funcionan en PHP7 siguen siendo las mejores prácticas.

    –Matt Cromwell

    3 de noviembre de 2016 a las 18:32

  • @MattCromwell. No estoy de acuerdo contigo. Hasta que los servicios de alojamiento admitan PHP7, deberíamos usar polyfill para random_int y random_bytes función – github.com/paragonie/random_compat.

    -Vladimir Posvistelik

    08/01/2017 a las 19:41

  • Tengo curiosidad, ¿hay alguna razón para NO usar random_int ? Si da “mejores” números aleatorios, ¿por qué no usarlo por razones no criptográficas?

    – Brian Leishmann

    21 de septiembre de 2017 a las 16:13

  • @BrianLeishman Prefiero usarlo para todo. El único inconveniente que puedo adivinar: probablemente se base en la fuente de aleatoriedad y podría fallar si no tiene aleatoriedad. Puede que sea más caro (es necesario comprobarlo), pero dudo que esta función marque una gran diferencia.

    – Salvador Dalí

    21 de septiembre de 2017 a las 17:54

  • Sé que es más lento, pero es lo suficientemente insignificante como para no volver atrás y cambiar lo que ya existe. random_ints a rands. Además, mi caso de uso es un algoritmo de reintento, y definitivamente no quiero que varias funciones fallidas se agrupen después de dormir debido a entradas aleatorias predecibles.

    – Brian Leishmann

    21 de septiembre de 2017 a las 18:18

avatar de usuario
matt cromwell

A más rápido la 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í, falla tu host para habilitarlo, o tienes que usar el rand() normal (y más lento).

  • te refieres a mas rapido verdad? la diferencia es (escribir == más rápido vs más rápido == rendimiento sabio)

    – Vale

    11 de febrero de 2014 a las 11:16


  • english.stackexchange.com/questions/31732/… – en realidad pueden ser ambos

    – pee2pee

    2 de junio de 2020 a las 17:55

He incluido las respuestas aquí y las he hecho independientes 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
}

(rand() % ($max-$min)) + $min

o

rand ( $min , $max )

http://php.net/manual/en/function.rand.php

avatar de usuario
winwaed

rand(1,20)

Los documentos para la función rand de PHP están aquí:

http://php.net/manual/en/function.rand.php

Utilizar el srand() función para establecer el valor inicial del generador de números aleatorios.

avatar de usuario
asi_x

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

¿Ha sido útil esta solución?