array_rand

(PHP 4, PHP 5)

array_randВыбирает одно или несколько случайных значений из массива

Описание

mixed array_rand ( array $input [, int $num_req = 1 ] )

Выбирает одно или несколько случайных значений из массива. Возвращает ключ (или ключи) данных случайных элементов.

Список параметров

input

Входной массив.

num_req

Определяет количество выбираемых элементов. Попытка выбрать больше элементов, чем есть в массиве, сгенерирует ошибку уровня E_WARNING.

Возвращаемые значения

Если вы выбираете только одно значение, функция array_rand() возвращает ключ, соответствующий этому значению. В обратном случае, она возвращает массив ключей, соответствующих случайным значениям. Это сделано так образом, чтобы дать возможность выбрать из массива как случайные значения, так и случайные ключи.

Список изменений

Версия Описание
5.2.10 Возвращаемый массив ключей больше не возвращается в случайном порядке.
4.2.0Генератор случайных чисел инициализируется автоматически.

Примеры

Пример #1 Пример использования array_rand()

<?php
$input 
= array("Neo""Morpheus""Trinity""Cypher""Tank");
$rand_keys array_rand($input2);
echo 
$input[$rand_keys[0]] . "\n";
echo 
$input[$rand_keys[1]] . "\n";
?>

Смотрите также

  • shuffle() - Перемешивает массив

Коментарии

Автор:
If the array elements are unique, and are all integers or strings, here is a simple way to pick $n random *values* (not keys) from an array $array:

<?php array_rand(array_flip($array), $n); ?>
2009-10-02 04:04:38
http://php5.kiev.ua/manual/ru/function.array-rand.html
Автор:
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
2012-07-13 17:42:13
http://php5.kiev.ua/manual/ru/function.array-rand.html
Автор:
<?php
// An example how to fetch multiple values from array_rand
$a = [ 'a''b''c''d''e''f''g' ];
$n 3;

// If you want to fetch multiple values you can try this:
print_rarray_intersect_key$aarray_fliparray_rand$a$n ) ) ) );

// If you want to re-index keys wrap the call in 'array_values':
print_rarray_valuesarray_intersect_key$aarray_fliparray_rand$a$n ) ) ) ) );
2018-03-03 11:22:05
http://php5.kiev.ua/manual/ru/function.array-rand.html
Автор:
<?php

/**
 * Wraps array_rand call with additional checks
 *
 * TLDR; not so radom as you'd wish.
 *
 * NOTICE: the closer you get to the input arrays length, for the n parameter, the  output gets less random.
 * e.g.: array_random($a, count($a)) == $a will yield true
 * This, most certainly, has to do with the method used for making the array random (see other comments).
 *
 * @throws OutOfBoundsException – if n less than one or exceeds size of input array
 *
 * @param array $array – array to randomize
 * @param int $n – how many elements to return
 * @return array
 */
function array_random(array $arrayint $n 1): array
{
    if (
$n || $n count($array)) {
        throw new 
OutOfBoundsException();
    }

    return (
$n !== 1)
        ? 
array_values(array_intersect_key($arrayarray_flip(array_rand($array$n))))
        : array(
$array[array_rand($array)]);
}
2018-03-03 12:19:28
http://php5.kiev.ua/manual/ru/function.array-rand.html
array_rand () takes a random value without ever being able to go back in its choice of random value.
A simple example:
I decide to mix an array of 10 entries to retrieve 3 values. This choice will give increasing and random values.

    $myarray = range(1,10);
   
    $pm = array_rand($myarray,3);     
    // $pm return array(0->0,1->6,2->8)

But if I decide to shuffle an array of 10 entries to get 10 entries, array_rand () will choose to assign a value to each return value and therefore the return array will not be random.

    $gm = array_rand($myarray,count($myarray)); 
    // $gm not random array(0->0,1->1,2->2,3->3,4->4,5->5,6->6,7->7,8->8,9->9)

The easiest way to have a truly random value:
either use array_rand () in a loop of 1 value at a time

$deg = range(-60,60);
$size = range(16,64);
$color = ["blue","red","green","pink","orange","purple","grey","darkgreen","darkkhaki"];
$i = 0;
$longueur = 10;
do{
    ++$i;
    printf("<span style='transform: rotateZ(%ddeg); display: inline-block;font-size: %spx; color:%s'>%s</span>",
        $deg[array_rand($deg)],
        $size[array_rand($size)],
        $color[array_rand($color)],
        $alnum[array_rand($alnum)]);

}while($i < $longueur);

------------------
or simply use shuffle () to shuffle the array really randomly.
2021-09-30 22:45:03
http://php5.kiev.ua/manual/ru/function.array-rand.html
Автор:
Generate random index in weights array.
Implementation of Vose's Alias Method.

<?php
class AliasMethod
{
    protected 
$count;
    protected 
$prob;
    protected 
$alias;

    public function 
__construct($weight)
    {
       
$count count($weight);
       
$sum array_sum($weight);
       
$d $count $sum;
       
$small = [];
       
$large = [];

        foreach (
$weight as $i => & $w) {
            if ( (
$w *= $d) < 1)
               
$small[] = $i;
            else
               
$large[] = $i;
        }
        unset(
$w);

       
$prob = [];
       
$alias = [];

        while (!empty(
$small) AND !empty($large)) {
           
$l array_pop($small);
           
$g array_pop($large);
           
$prob[$l] = $weight[$l];
           
$alias[$l] = $g;

            if ( (
$weight[$g] += $weight[$l] - 1) < 1)
               
$small[] = $g;
            else
               
$large[] = $g;
        }

        foreach (
$large as $i)
           
$prob[$i] = 1;

        foreach (
$small as $i)
           
$prob[$i] = 1;

       
$this->prob $prob;
       
$this->alias $alias;
       
$this->count $count;

    }

    public function 
next(): int
   
{
       
$i mt_rand(0$this->count 1);
        if (
mt_rand() / mt_getrandmax() <= $this->prob[$i])
            return 
$i;
        else
            return 
$this->alias[$i];
    }
}

// Usage:

$weight = [121110011511];
$rnd = new AliasMethod($weight);

$results array_fill(0count($weight), 0);

for(
$i 0$i 100000; ++$i) {
   
$results[$rnd->next()]++;
}
print_r($results);

/*
 Array
(
    [0] => 901
    [1] => 1785
    [2] => 899
    [3] => 907
    [4] => 87655
    [5] => 867
    [6] => 836
    [7] => 4371
    [8] => 910
    [9] => 869
)
 */
2021-12-03 17:06:19
http://php5.kiev.ua/manual/ru/function.array-rand.html
for a cryptographically secure version, try 

<?php

/**
 * fetch a random key from array, using a cryptograpically secure rng
 * discussed+reviewed at https://codereview.stackexchange.com/questions/275832/cryptographically-secure-version-of-the-core-array-rand-function/
 *
 * @param array $array
 * @throws ValueError if array is empty
 * @return int|string key
 */
function array_rand_cryptographically_secure(array $array)/*: int|string*/ {
   
$max count $array ) - 1;
    if (
$max 0) {
        throw new 
ValueError 'Argument #1 ($array) cannot be empty' );
    }
    return 
key array_slice $arrayrandom_int 0$max ), 1true ) );
}

$tests = [
        [
567],
        [
'a' => 1'b' => 2'c' => 3],
        [
'zero'=> 'four'=> 'nine'],
        [
"PEAN"=>0],
        []
];
foreach (
$tests as $test) {
    echo 
array_rand_cryptographically_secure($test) . "\n";
}

?> 
(this is an improved version, which unlike the first version, avoids copying *all* the keys)
2022-04-19 16:36:16
http://php5.kiev.ua/manual/ru/function.array-rand.html

    Поддержать сайт на родительском проекте КГБ