php 中按概率控制數(shù)組元素出現(xiàn)順序打亂的方法:打亂數(shù)組順序:使用 shuffle() 函數(shù)。分配概率:使用 array_map() 為每個(gè)元素分配概率(0-1)。排序加權(quán)數(shù)組:按概率降序排序數(shù)組(概率高的元素在前)。提取元素:依次從排序后的數(shù)組中提取元素,即得按概率控制順序的打亂數(shù)組。
PHP 中使用概率控制打亂數(shù)組元素的出現(xiàn)順序
打亂數(shù)組的元素順序是諸多開發(fā)場(chǎng)景中常見的需求,例如,隨機(jī)抽獎(jiǎng)、游戲機(jī)制等。如果需要在打亂數(shù)組后按概率控制元素的出現(xiàn)順序,PHP 提供了恰當(dāng)?shù)暮瘮?shù)和方法。
準(zhǔn)備工作
首先,準(zhǔn)備一個(gè)包含要打亂元素的數(shù)組。例如:
$array = [1, 2, 3, 4, 5];
登錄后復(fù)制
使用 shuffle()
函數(shù)打亂數(shù)組
shuffle()
函數(shù)可以打亂數(shù)組中元素的順序。
shuffle($array);
登錄后復(fù)制
使用概率控制元素出現(xiàn)的順序
使用 array_map()
方法遍歷數(shù)組元素,為每個(gè)元素分配一個(gè)概率。概率值介于 0 到 1 之間,其中 0 表示該元素永遠(yuǎn)不會(huì)出現(xiàn),1 表示該元素始終出現(xiàn)。
$probabilities = [0.2, 0.3, 0.4, 0.5, 0.6]; $weightedArray = array_map(function ($element, $probability) { return [$element, $probability]; }, $array, $probabilities);
登錄后復(fù)制
排序加權(quán)數(shù)組
對(duì)加權(quán)數(shù)組進(jìn)行排序,概率較高的元素將處于數(shù)組開頭。
usort($weightedArray, function ($a, $b) { return $b[1] <=> $a[1]; });
登錄后復(fù)制
提取元素
現(xiàn)在,從排序后的加權(quán)數(shù)組中依次提取元素,即可獲得按概率控制順序的打亂數(shù)組。
$reorderedArray = []; foreach ($weightedArray as $element) { $reorderedArray[] = $element[0]; }
登錄后復(fù)制
實(shí)戰(zhàn)案例
假設(shè)有一個(gè)游戲,需要從一個(gè)包含 5 個(gè)物品的數(shù)組中隨機(jī)抽取 3 個(gè)物品。每個(gè)物品出現(xiàn)的概率分別為:
物品 1:20%物品 2:30%物品 3:40%物品 4:50%物品 5:60%
可以按上述步驟實(shí)現(xiàn)如下代碼:
$items = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5']; $probabilities = [0.2, 0.3, 0.4, 0.5, 0.6]; shuffle($items); $weightedItems = array_map(function ($item, $probability) { return [$item, $probability]; }, $items, $probabilities); usort($weightedItems, function ($a, $b) { return $b[1] <=> $a[1]; }); $drawnItems = []; for ($i = 0; $i < 3; $i++) { $drawnItems[] = $weightedItems[$i][0]; } print_r($drawnItems);
登錄后復(fù)制
運(yùn)行以上代碼,將輸出按概率控制順序抽取的 3 個(gè)物品。