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


123

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?

Respuestas:


232

También puedes hacer solo:

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

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


11
según este comentario array_rand no es tan aleatorio como debería ser
Timo Huovinen

1
O puede requerir este paquete y usarloarray_rand_value
murze

10
Desde PHP 7.1, array_rand()utiliza el generador Mersenne Twister: rand () con alias mt_rand () y srand () con alias mt_srand () . En la práctica, ahora debería ser lo suficientemente bueno.
Gras Double


23

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;
}

44
Debe ser mt_rand (0, 3) ya que solo hay 4 elementos. Sin embargo, más correctamente: $ array [mt_rand (0, count ($ array)]
reko_t

2
Err, creo que te refieres a mt_rand (0, count ($ ran) - 1)
Josh Davis

según los comentarios de php array_randno es tan aleatorio como debería ser, por lo que mt_randes preferible
Timo Huovinen

1
¿Cuál es el punto en toda la issetparte? Esto fallaría para las matrices asociativas de todos modos.
Luke Cousins ​​el

No sé por qué, pero cuando lo uso en mt_randlugar de randen este caso parece preferir algunos elementos más que otros
usuario151496

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

14

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)];

11

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

  • $amounttiene que ser menor que o igual a count($array).
  • array_rand()no baraja claves (desde PHP 5.2.10, consulte 48224 ), por lo que sus elementos seleccionados siempre estarán en el orden original. Usar shuffle()después si es necesario.


Documentación: array_rand(),shuffle()


editar: La función Laravel ha crecido notablemente desde entonces, ver Laravel 5.4 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 puntos destacados:

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

8

La array_randfunción parece tener una distribución desigual en matrices grandes, no todos los elementos de la matriz tienen la misma probabilidad de ser elegidos. Usar shuffle 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 único elemento aleatorio. Las otras respuestas que utilizan mt_rand()probablemente sean más adecuadas para la tarea.
rinogo

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

5

Otro enfoque a través de voltear la matriz para obtener un valor directo.

Retazo

$array = [ 'Name1' => 'John', 'Name2' => 'Jane', 'Name3' => 'Jonny' ];
$val = array_rand(array_flip($array));

array_randclave de retorno no valor. Entonces, estamos cambiando el valor como clave.

Nota: la clave PHP siempre será una clave única, por lo que cuando se invierte la matriz, se sobrescribirá el valor duplicado como clave.


¿Por qué no simplemente hacer $array[array_rand($array)];?
rinogo

@rinogo También funciona, esto ya respondió anteriormente. Esto es un poco diferente de su respuesta, array_flipelimine el duplicado como clave y luego dé el resultado ... ¡Signifique que no hay duplicado!
Smartpal

4
$rand = rand(1,4);

o, para matrices específicamente:

$array = array('a value', 'another value', 'just some value', 'not some value');
$rand = $array[ rand(0, count($array)-1) ];

2
Nunca obtendría el primer elemento de esta lista y saldría del conjunto con 4
Ólafur Waage

El primer $ rand se trata de valores. La matriz original tiene valores que van del 1 al 4. El segundo $ rand trata sobre las claves de la matriz, del 0 al 3.
Josh Davis

3

En mi caso, tengo que obtener 2 valores que son objetos. Comparto esta solución simple.

$ran = array("a","b","c","d");
$ranval = array_map(function($i) use($ran){return $ran[$i];},array_rand($ran,2));

2

¿Su selección tiene alguna implicación de seguridad? Si es así, use random_int()y array_keys(). ( random_bytes()es solo PHP 7, pero hay un polyfill para PHP 5 ).

function random_index(array $source)
{
    $max = count($source) - 1;
    $r = random_int(0, $max);
    $k = array_keys($source);
    return $k[$r];
}

Uso:

$array = [
    'apple' =>   1234,
    'boy'   =>   2345,
    'cat'   =>   3456,
    'dog'   =>   4567,
    'echo'  =>   5678,
    'fortune' => 6789
];
$i = random_index($array);
var_dump([$i, $array[$i]]);

Demostración: https://3v4l.org/1joB1


2

Use rand () para obtener un número aleatorio para hacer eco de una clave aleatoria. En ex: 0 - 3

$ran = array(1,2,3,4);
echo $ran[rand(0,3)];


2

Necesitaba una versión de línea para una matriz corta:

($array = [1, 2, 3, 4])[mt_rand(0, count($array) - 1)]

o si la matriz es fija:

[1, 2, 3, 4][mt_rand(0, 3]

2

En línea:

echo $array[array_rand($array,1)]

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo responde a la pregunta mejora su valor a largo plazo.
β.εηοιτ.βε

1

Esto funcionará bien con matrices en línea. Además, creo que las cosas son más ordenadas y más reutilizables cuando se envuelve en una función.

function array_rand_value($a) {
    return $a[array_rand($a)];
}

Uso:

array_rand_value(array("a", "b", "c", "d"));

En PHP <7.1.0, array_rand()utiliza rand(), por lo que no querrá esta función para nada relacionado con la seguridad o la criptografía. En PHP 7.1.0+, use esta función sin preocupación ya que rand()se le ha asignado un aliasmt_rand() .


0

Estoy basando mi respuesta en la función de @ ÓlafurWaage. Traté de usarlo pero me encontré con problemas de referencia cuando intenté modificar el objeto devuelto. Actualicé su función para pasar y volver por referencia. La nueva función es:

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

Para más contexto, vea mi pregunta en Pasar / Devolver referencias a objeto + cambiar objeto no funciona


0

Una forma sencilla de obtener el valor Randdom de Array .

$color_array =["red","green","blue","light_orange"];
$color_array[rand(0,3)

ahora cada vez obtendrás diferentes colores de Array .


-5

Obtiene un número aleatorio de una matriz de la siguiente manera:

$randomValue = $rand[array_rand($rand,1)];

44
array_rand () devuelve una clave aleatoria, no un valor aleatorio.
reko_t
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.