PHP中基于概率的数组随机洗牌:有没有更高效的实现方式?
基于权重的概率洗牌优化(PHP)
需求说明
我有一个PHP键值对数组,键为名称,值为对应的权重(关联概率):
Value Probability John 3 Peter 2 Paul 1
需要对数组进行带概率权重的洗牌:统计意义上,John有半数概率排在列表顶部,Peter占1/3,Paul占1/6;经过数千次洗牌后,整体平均顺序需符合该概率分布。
当前实现方案
我现在的实现步骤如下:
- 生成扩展数组,每个元素按自身权重重复对应次数:
John John John Peter Peter Paul
- 打乱扩展数组,示例结果:
John Paul Peter John John Peter
- 去重并保留元素首次出现的顺序,得到最终排序:
John Paul Peter
对应的PHP代码:
$items = array( 'John' => 3, 'Peter' => 2, 'Paul' => 1 ); $probabilities = array(); foreach($items as $item => $value){ $interim = array_fill(1, $value, $item); $probabilities = array_merge($probabilities, $interim); } shuffle($probabilities); $result = array_unique($probabilities); print("<pre>".print_r($result,true)."</pre>");
性能优化疑问
有没有更高效的实现方式?
实际场景中,数组包含数百个元素,且每次网页请求都要执行该概率洗牌操作,必须保证极致性能。
补充:各位置概率分布
为直观展示,以下是各元素在不同位置的概率分布:
Person P1 P2 P3 John 3/6 2/6 1/6 Peter 2/6 2/6 2/6 Paul 1/6 2/6 3/6
注:第二名和第三名的概率由第一名的概率推导而来,未在原始数据中明确给出,仅作展示。
实际场景示例
实际应用中的数组包含数百条数据,结构类似:
John 3 ← line 1 Peter 2 Paul 1 Simon 6 Robert 2 William 1 ... Sean 1 ← line 786
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

