php - tabla - Cómo obtener valor aleatorio de una matriz
numero aleatorio excel (12)
Tengo una matriz llamada $ran = array(1,2,3,4);
Necesito obtener un valor aleatorio de este conjunto y almacenarlo en una variable, ¿cómo puedo hacer esto?
¿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
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 quecount($array)
. -
array_rand()
no mezcla las claves (desde PHP 5.2.10, consulte 48224 ), por lo que sus elementos seleccionados siempre estarán en el orden original. Useshuffle()
luego si es necesario.
Documentación: array_rand()
, shuffle()
editar: La función de Laravel ha crecido notablemente desde entonces, ver Arr::random()
Laravel 5.4 Arr::random()
. Aquí hay algo más elaborado, derivado de la función de Laravel adulta:
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:
Estoy basando mi respuesta en la función de @ ÓlafurWaage. Intenté usarlo pero me encontré con problemas de referencia cuando intenté modificar el objeto de devolución. Actualicé su función para pasar y regresar 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 obtener más contexto, vea mi pregunta en Pasando / Volviendo referencias a objeto + cambio de objeto no funciona
La función array_rand
parece tener una distribución desigual en matrices grandes, no todos los elementos de la matriz tienen la misma probabilidad de ser seleccionados. Usar el orden 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];
Obtienes un número aleatorio de una matriz de la siguiente manera:
$randomValue = array_rand($rand,1);
PHP proporciona una función solo para eso: array_rand ()
array_rand()
$ran = array(1,2,3,4);
$randomElement = $ran[array_rand($ran, 1)];
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)];
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;
}
También puedes hacer lo siguiente:
$k = array_rand($array);
$v = $array[$k];
Esta es la forma de hacerlo cuando tienes una matriz asociativa.
Use rand () para obtener un número aleatorio para repetir la clave aleatoria. En ex: 0 - 3
$ran = array(1,2,3,4);
echo $ran[rand(0,3)];
$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) ];
$value = $array[array_rand($array)];