PHP數組打亂順序后如何通過概率來控制元素的出現順序?
php 中按概率控制數組元素出現順序打亂的方法:打亂數組順序:使用 shuffle() 函數。分配概率:使用 array_map() 為每個元素分配概率(0-1)。排序加權數組:按概率降序排序數組(概率高的元素在前)。提取元素:依次從排序后的數組中提取元素,即得按概率控制順序的打亂數組。
PHP 中使用概率控制打亂數組元素的出現順序
打亂數組的元素順序是諸多開發場景中常見的需求,例如,隨機抽獎、游戲機制等。如果需要在打亂數組后按概率控制元素的出現順序,PHP 提供了恰當的函數和方法。
準備工作
首先,準備一個包含要打亂元素的數組。例如:
$array = [1, 2, 3, 4, 5];
使用 函數打亂數組
函數可以打亂數組中元素的順序。
shuffle($array);
使用概率控制元素出現的順序
使用 方法遍歷數組元素,為每個元素分配一個概率。概率值介于 0 到 1 之間,其中 0 表示該元素永遠不會出現,1 表示該元素始終出現。
$probabilities = [0.2, 0.3, 0.4, 0.5, 0.6];
$weightedArray = array_map(function ($element, $probability) {
return [$element, $probability];
}, $array, $probabilities);
排序加權數組
對加權數組進行排序,概率較高的元素將處于數組開頭。
usort($weightedArray, function ($a, $b) {
return $b[1] <=> $a[1];
});
提取元素
現在,從排序后的加權數組中依次提取元素,即可獲得按概率控制順序的打亂數組。
$reorderedArray = [];
foreach ($weightedArray as $element) {
$reorderedArray[] = $element[0];
}
實戰案例
假設有一個游戲,需要從一個包含 5 個物品的數組中隨機抽取 3 個物品。每個物品出現的概率分別為:
物品 1:20%物品 2:30%物品 3:40%物品 4:50%物品 5:60%
可以按上述步驟實現如下代碼:
$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);
運行以上代碼,將輸出按概率控制順序抽取的 3 個物品。
相關推薦
-
PHP數組的復制策略:深度復制與淺復制,解析與性能對比
在 php 中,數組復制有兩種策略:深度復制和淺復制。深度復制創建源數組的獨立副本,對其中一個數組的更改不會影響另一個數組。淺復制僅復制數組的引用,對其中一個數組的更改會反映在另一個數組中。深度復制需
-
PHP 數組鍵值互換:基于特定數據集的性能優化
在 php 中,數組鍵值互換可以通過 array_flip() 函數實現。對于大型數組,手動循環能提高性能。實戰案例中,通過手動循環優化,可以顯著提升映射用戶 id 到用戶名的數組轉換速度,加快查詢速
-
PHP數組打亂順序后如何進行去重操作?
php中可以通過以下步驟打亂數組順序后進行去重操作:使用shuffle()函數打亂數組順序。使用array_unique()函數對數組進行去重,移除重復元素。PHP數組打亂順序后進行去重操作在 PHP
-
PHP 中如何根據數組鍵名長度進行排序,保留鍵名?
通過 uksort() 函數和自定義比較函數 comparekeylengths,可以根據數組鍵名長度對 php 數組進行排序,同時保留鍵名。比較函數計算鍵名長度差并返回一個整數,uksort() 根
-
PHP 數組鍵值交換:高效實現及其性能探討
php 數組鍵值交換的兩種高效方法:使用 array_flip() 函數(高效,推薦用于大量數據)手動交換(相對較慢,適用于少量數據)性能測試表明,array_flip() 函數在交換 100,000















