首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP array_rand 從陣列隨機取出元素

     編輯:PHP 綜合知識

函數原型

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

回傳值行為

情況回傳型別說明
$num = 1 (預設)int|string單一**鍵名** (非值)
$num > 1array鍵名陣列
陣列為空觸發 E_WARNING回傳 null

基本用法

<?php
$fruits = ['a' => 'Apple', 'b' => 'Banana', 'c' => 'Cherry'];

// 取 1 個鍵名
$key = array_rand($fruits);
echo "Key: $key, Value: {$fruits[$key]}";
// Key: b, Value: Banana

// 取 2 個鍵名
$keys = array_rand($fruits, 2);
print_r($keys);
// Array ( [0] => c [1] => a )

// 取得對應值
$values = array_intersect_key($fruits, array_flip($keys));
print_r($values);
// Array ( [c] => Cherry [a] => Apple )
?>

進階:取得隨機值 (而非鍵名)

<?php
function array_random_values(array $array, int $num = 1): array
{
    if (empty($array)) return [];
    $num = min($num, count($array));
    $keys = array_rand($array, $num);
    // array_rand 回傳單一鍵名時非陣列,需統一
    $keys = (array)$keys;
    return array_intersect_key($array, array_flip($keys));
}

$data = ['id1' => 'A', 'id2' => 'B', 'id3' => 'C', 'id4' => 'D'];
print_r(array_random_values($data, 2));
// Array ( [id3] => C [id1] => A )
?>

隨機打亂陣列順序

<?php
// 方法 1: shuffle (修改原陣列,重設數字索引)
$arr = [1, 2, 3, 4, 5];
shuffle($arr);
// [3, 1, 5, 2, 4]

// 方法 2: array_rand 保留鍵名關聯
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
$keys = array_rand($arr, count($arr));
$shuffled = array_intersect_key($arr, array_flip($keys));
// 保留鍵名: ['c' => 3, 'a' => 1, 'b' => 2]

// 方法 3: 現代 PHP 8.1+ 使用 Random\Randomizer
$randomizer = new Random\Randomizer();
$arr = [1, 2, 3, 4, 5];
$randomizer->shuffle($arr); // 原地打亂,回傳 void
?>

加權隨機抽樣 (非均勻機率)

<?php
function weightedRandom(array $weights): string
{
    // $weights = ['A' => 10, 'B' => 30, 'C' => 60]  // 權重總和 100
    $total = array_sum($weights);
    $rand = mt_rand(1, $total);
    
    $cum = 0;
    foreach ($weights as $key => $weight) {
        $cum += $weight;
        if ($rand <= $cum) return $key;
    }
    return array_key_first($weights); // 兜底
}

$prizes = ['大獎' => 1, '小獎' => 9, '無' => 90];
$counts = [];
for ($i = 0; $i < 10000; $i++) {
    $counts[weightedRandom($prizes)]++;
}
print_r($counts);
// 大獎 ≈ 100, 小獎 ≈ 900, 無 ≈ 9000
?>

安全性注意

  • array_rand 使用 Mersenne Twister (**非加密安全**)
  • 密碼學用途 (Token、抽獎、洗牌) 請用 random_int()、Random\Randomizer (PHP 8.2+)
<?php
// 加密安全的隨機打亂 (PHP 8.2+)
$randomizer = new Random\Randomizer(
    new Random\Engine\Secure() // 使用 OS CSPRNG
);
$cards = range(1, 52);
$randomizer->shuffle($cards); // 適合發牌遊戲

// PHP 7/8.1 相容寫法
function secureShuffle(array &$array): void
{
    $n = count($array);
    for ($i = $n - 1; $i > 0; $i--) {
        $j = random_int(0, $i);
        [$array[$i], $array[$j]] = [$array[$j], $array[$i]];
    }
}
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved