array_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

array_randPrend une ou plusieurs clés, au hasard dans un tableau

Description

array_rand(array $array, int $num = 1): int|string|array

Sélectionne une ou plusieurs valeurs au hasard dans un tableau et retourne la ou les clés de ces valeurs. Cette fonction utilise un pseudo générateur de nombre aléatoire, ce qui ne convient pas pour de la cryptographie.

Liste de paramètres

array

Le tableau d'entrée.

num

Spécifie le nombre d'entrées que vous voulez récupérer.

Valeurs de retour

Lorsque vous ne récupérez qu'une seule entrée, la fonction array_rand() retourne la clé d'une entrée choisie aléatoirement. Sinon, un tableau de clés d'entrées aléatoires sera retourné. Cela vous permet de faire une sélection au hasard de clés, ou bien de valeurs. Si plusieurs clés sont retournées, alors elles le seront dans l'ordre qu'elles étaient dans le tableau d'origine Le fait de tenter de récupérer plus d'éléments qu'il n'y en a dans le tableau fera qu'une erreur de niveau E_WARNING sera émise, et NULL sera retourné.

Historique

Version Description
7.1.0 L'algorithme interne de génération aléatoire a été modifié pour utiliser le générateur aleatoire de nombre »  Mersenne Twister au lieu de la fonction aléatoire libc

Exemples

Exemple #1 Exemple avec 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";
?>

Voir aussi

  • shuffle() - Mélange les éléments d'un tableau

add a note add a note

User Contributed Notes 6 notes

up
65
Anonymous
12 years ago
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); ?>
up
28
Anonymous
9 years ago
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
up
15
grzeniufication
3 years ago
<?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 $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)]);
}
up
15
grzeniufication
3 years ago
<?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_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 ) ) ) ) );
up
0
Vitaly
1 day ago
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 = [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);

/*
Array
(
    [0] => 901
    [1] => 1785
    [2] => 899
    [3] => 907
    [4] => 87655
    [5] => 867
    [6] => 836
    [7] => 4371
    [8] => 910
    [9] => 869
)
*/
up
0
fulachan2 at gmail dot com
2 months ago
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.
To Top