如何根据重量选择一个数字

时间:2012-06-01 22:26:41

标签: php random

让我说我有一个对象:

$person->name = array('James',
                      'Sam',
                      'Kevin',
                      'Mike');
$person->weight = array(1,
                        3,
                        1,
                        7);

在上面的示例中,James的权重为1Sam的权重为3等等(基于索引位置)

我希望只能回应一个人的名字。重量越高,您的名字被选中的机会就越大。重量越低,您选择名称的机会就越低。有点像彩票,但有重量。关于如何做到这一点的任何想法?

4 个答案:

答案 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中重写。