Рандом из массива php

zgulde / php_random_array_element.md

Figuring out how to get a random array element will give a better understanding of how PHP works, as well as how arrays work in general.

Lets start with this code:

And get a random number out of it!

First we need a random index out of the array.

Remember that arrays are 0 — indexed, and the largest index is one less than the number of items in the array.

Using our $numbers array as an example:

$numbers = [1, 2, 3, 4, 5]; // ^ ^ ^ ^ ^ // indexes | | | | | // 0 1 2 3 4
  • The first element, 1 is at index 0 , and the last element, 5 is at index 4
  • The total number of elements in the array is 5
  • 4, the greatest index in the array, is one less than 5, the total number of elements in the array.

Keeping this in mind, lets get a random index from our $numbers array. We’ll use PHP’s build-in count function that returns the number of items in an array.

$randomIndex = mt_rand(0, count($numbers) - 1);

Luckily, PHP has a built-in function to do all this thinking for us, array_rand . All we have to do is give array_rand an array, and it will return us a random index in it. We could rewrite our code like so.

$randomIndex = array_rand($numbers);

Now we need to access the element at our random index.

$randomNumber = $numbers[$randomIndex];

And we have a random number from our array!

Lets pull this code out into a separate function that we can reuse.

function getRandomArrayElement($array) < $randomIndex = array_rand($array); $randomElement = $array[$randomIndex]; return $randomElement; >

Now to get a random number from our $numbers array, all we would have to do is call our function.

$randomNumber = getRandomArrayElement($numbers);

We could also rewrite our function to be a one liner:

function getRandomArrayElement($array) < return $array[array_rand($array)]; >

Источник

Получить случайные элементы из массива в PHP

В этом посте мы обсудим, как генерировать случайные записи из массива в PHP.

1. Использование array_rand() функция

Простым и эффективным решением является использование array_rand() функция для выбора одной или нескольких случайных записей из массива. Вот программа PHP для выбора случайного ключа из массива $arr :

The array_rand() Функция возвращает ключ случайной записи. Чтобы выбрать случайное значение (не ключ) случайной записи, используйте приведенный ниже фрагмент кода:

Вот пример использования замыкания.

Второй аргумент array_rand() Функция указывает, сколько случайных записей должно быть выбрано. Вот программа PHP для выбора $n случайные значения из массива $arr :

Видеть Руководство по PHP Больше подробностей.

2. Использование mt_rand() функция

До PHP 7.1.0 внутренний алгоритм рандомизации для array_rand() использует функцию libc rand, которая работает медленнее и менее случайна, чем генератор чисел Mersenne Twister. Если ваши ключи массива являются числовыми, вот лучшая альтернатива для выбора случайного значения из массива $arr :

The mt_rand() функция является лучшей альтернативой для старых rand() . Однако оба array_rand() а также mt_rand() не генерирует криптографически безопасные значения. В криптографических целях рассмотрите возможность использования random_int() , random_bytes() , или же openssl_random_pseudo_bytes() вместо.

Ссылаться на Руководство по PHP Больше подробностей.

Это все о генерации случайных записей из массива в PHP.

Средний рейтинг 4.92 /5. Подсчет голосов: 12

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?

Источник

array_rand

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

Функция не создаёт криптографически защищённые значения и не должна использоваться для криптографических целей или целей, требующих, чтобы возвращаемые значения были недоступны для разгадывания.

Если требуется криптографически безопасная случайная последовательность, Random\Randomizer может использоваться с движком Random\Engine\Secure . Для простых случаев использования функции random_int() и random_bytes() предоставляют удобный и безопасный API, поддерживаемый CSPRNG операционной системы.

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

Определяет количество выбираемых элементов.

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

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

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

Версия Описание
7.1.0 Внутренний алгоритм получения случайных чисел изменён с функции rand библиотеки libc на генератор на базе » Вихря Мерсенна.

Примеры

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

$input = array( «Neo» , «Morpheus» , «Trinity» , «Cypher» , «Tank» );
$rand_keys = array_rand ( $input , 2 );
echo $input [ $rand_keys [ 0 ]] . «\n» ;
echo $input [ $rand_keys [ 1 ]] . «\n» ;
?>

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

User Contributed Notes 7 notes

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:

It doesn’t explicitly say it in the documentation, but PHP won’t pick the same key twice in one call.

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.

$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

——————
or simply use shuffle () to shuffle the array really randomly.

/**
* 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 $array , int $n = 1 ): array
if ( $n < 1 || $n >count ( $array )) throw new OutOfBoundsException ();
>

return ( $n !== 1 )
? array_values ( array_intersect_key ( $array , array_flip ( array_rand ( $array , $n ))))
: array( $array [ array_rand ( $array )]);
>

// 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_r ( array_intersect_key ( $a , array_flip ( array_rand ( $a , $n ) ) ) );

// If you want to re-index keys wrap the call in ‘array_values’:
print_r ( array_values ( array_intersect_key ( $a , array_flip ( array_rand ( $a , $n ) ) ) ) );

for a cryptographically secure version, try

/**
* 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 ( $array , random_int ( 0 , $max ), 1 , true ) );
>

$tests = [
[ 5 , 6 , 7 ],
[ ‘a’ => 1 , ‘b’ => 2 , ‘c’ => 3 ],
[ ‘zero’ , 4 => ‘four’ , 9 => ‘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)

Generate random index in weights array.
Implementation of Vose’s Alias Method.

class AliasMethod
protected $count ;
protected $prob ;
protected $alias ;

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

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 () prob [ $i ])
return $i ;
else
return $this -> alias [ $i ];
>
>

$weight = [ 1 , 2 , 1 , 1 , 100 , 1 , 1 , 5 , 1 , 1 ];
$rnd = new AliasMethod ( $weight );

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

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

Оцените статью