¿Cómo obtener un valor aleatorio de una matriz?

4 minutos de lectura

¿Como obtener un valor aleatorio de una matriz
Elitmiar

tengo una matriz llamada $ran = array(1,2,3,4);

Necesito obtener un valor aleatorio de esta matriz y almacenarlo en una variable, ¿cómo puedo hacer esto?

También puedes hacer simplemente:

$k = array_rand($array);
$v = $array[$k];

Esta es la forma de hacerlo cuando tiene una matriz asociativa.

¿Como obtener un valor aleatorio de una matriz
NDM

PHP proporciona una función solo para eso: array_rand()
http://php.net/manual/en/function.array-rand.php

$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];

  • El valor predeterminado del segundo argumento de array_rand la función es 1 así que no es necesario escribirlo.

    – Nabi Kaz

    22 de noviembre de 2017 a las 22:50

¿Como obtener un valor aleatorio de una matriz
Ólafur Waage

Puedes usar mt_rand()

$random = $ran[mt_rand(0, count($ran) - 1)];

Esto también es útil como una función si necesita el valor

function random_value($array, $default=null)
{
    $k = mt_rand(0, count($array) - 1);
    return isset($array[$k])? $array[$k]: $default;
}

  • Debería ser mt_rand(0, 3) ya que solo hay 4 elementos. Sin embargo, más correctamente: $ matriz[mt_rand(0, count($array)]

    – reko_t

    29 de octubre de 2009 a las 12:43

  • Err, creo que quisiste decir mt_rand(0, count($ran) – 1)

    –Josh Davis

    29 de octubre de 2009 a las 12:50

  • según los comentarios de php array_rand no es tan aleatorio como debería ser, por lo que mt_rand se prefiere

    – Timo Huovinen

    23 oct 2014 a las 9:00

  • ¿Cuál es el punto en el todo isset ¿parte? De todos modos, esto fallaría para las matrices asociativas.

    – Lucas primos

    18 de enero de 2015 a las 12:32

  • no sé por qué, pero al usar mt_rand en lugar de rand en este caso parece preferir algunos artículos más que otros

    – usuario151496

    9 de junio de 2016 a las 14:02


$value = $array[array_rand($array)];

1646757615 347 ¿Como obtener un valor aleatorio de una matriz
TORTUGA

Puede usar la función array_rand para seleccionar una clave aleatoria de su matriz como se muestra a continuación.

$array = array("one", "two", "three", "four", "five", "six");
echo $array[array_rand($array, 1)];

o puede usar las funciones rand y count para seleccionar un índice aleatorio.

$array = array("one", "two", "three", "four", "five", "six");
echo $array[rand(0, count($array) - 1)];

Derivado de Laravel Collection::random():

function array_random($array, $amount = 1)
{
    $keys = array_rand($array, $amount);

    if ($amount == 1) {
        return $array[$keys];
    }

    $results = [];
    foreach ($keys as $key) {
        $results[] = $array[$key];
    }

    return $results;
}

Uso:

$items = ['foo', 'bar', 'baz', 'lorem'=>'ipsum'];

array_random($items); // 'bar'
array_random($items, 2); // ['foo', 'ipsum']

Algunas notas:

  • $amount tiene que ser menor o igual que count($array).
  • array_rand() no mezcla las teclas (desde PHP 5.2.10, consulte 48224), por lo que sus artículos seleccionados siempre estarán en el orden original. Utilizar shuffle() después si es necesario.

Documentación: array_rand(), shuffle()

editar: La función de Laravel ha crecido notablemente desde entonces, vea Laravel 5.4’s Arr::random(). Aquí hay algo más elaborado, derivado de la función adulta de Laravel:

function array_random($array, $number = null)
{
    $requested = ($number === null) ? 1 : $number;
    $count = count($array);

    if ($requested > $count) {
        throw new \RangeException(
            "You requested {$requested} items, but there are only {$count} items available."
        );
    }

    if ($number === null) {
        return $array[array_rand($array)];
    }

    if ((int) $number === 0) {
        return [];
    }

    $keys = (array) array_rand($array, $number);

    $results = [];
    foreach ($keys as $key) {
        $results[] = $array[$key];
    }

    return $results;
}

Algunos aspectos destacados:

  • Lanza una excepción si no hay suficientes elementos disponibles
  • array_random($array, 1) devuelve una matriz de un elemento (#19826)
  • Valor de soporte “0” para el número de artículos (#20439)

1646757615 462 ¿Como obtener un valor aleatorio de una matriz
asciiom

los array_rand La función parece tener una distribución desigual en matrices grandes, no todos los elementos de la matriz tienen la misma probabilidad de ser elegidos. Utilizando barajar en la matriz y luego tomar el primer elemento no tiene este problema:

$myArray = array(1, 2, 3, 4, 5);

// Random shuffle
shuffle($myArray);

// First element is random now
$randomValue = $myArray[0];

  • Sin embargo, eso es mucho “trabajo” computacional adicional solo para obtener un solo elemento aleatorio. Las otras respuestas que usan mt_rand() probablemente se adapten mejor a la tarea.

    – rinogo

    2 mayo 2019 a las 20:45

  • Depende de cuáles sean tus necesidades, supongo. En mi caso, la distribución era muy importante y la sobrecarga computacional no lo era.

    – Asciiom

    3 de mayo de 2019 a las 8:03

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad