让我说我有一个对象:
$person->name = array('James',
'Sam',
'Kevin',
'Mike');
$person->weight = array(1,
3,
1,
7);
在上面的示例中,James
的权重为1
,Sam
的权重为3
等等(基于索引位置)
我希望只能回应一个人的名字。重量越高,您的名字被选中的机会就越大。重量越低,您选择名称的机会就越低。有点像彩票,但有重量。关于如何做到这一点的任何想法?
答案 0 :(得分:3)
这应该有效:
$weighted = array();
foreach($person->weight as $key => $value) {
$weighted = array_merge($weighted, array_fill(0, $value, $key));
}
$index = array_rand($weighted);
echo $person->name[$index];
基于this answer。
答案 1 :(得分:1)
创建一个新数组,将名称Sam添加到数组3次,mike 7次,其他一次并随机选择一个。
答案 2 :(得分:1)
您还可以将所有权重相加并在一个和该总和之间生成一个随机数。然后你可以迭代权重数组,将它们相加,直到结果为> =随机数并取出那个人。可能会稍快一些。
答案 3 :(得分:0)
我可以建议在本文中实现和描述的算法 -
Random value selection from array based on weight。它包含Javascript实现,但我认为它可以在几分钟内在PHP中重写。