随机加权分布

时间:2017-02-14 18:44:08

标签: php probability combinatorics bernoulli-probability

例如我有一个像:

这样的数组
$items = [
    '0' => [
        'name' => 'item1', 
        'percent' => 10
        ],
    '2' => [
        'name' => 'item2', 
        'percent' => 20
        ],
    '3' => [
        'name' => 'item3', 
        'percent' => 30
        ],
    '4' => [
        'name' => 'item4', 
        'percent' => 40
        ],
];

功能:

function echoRandomItem(){
}

如果我调用此函数,它应该返回项目的'name',具体取决于'percent'值。基本上如果我调用此函数100次,它应该返回item1 10次,item2 20次,item3 30次,item4 40次。

1 个答案:

答案 0 :(得分:1)

感谢奥利弗的暗示,这是我提出的解决方案。 $items是给定的数组。 wrand()函数负责随机加​​权分布计算。

$items = [
    '1' => [
        'name' => 'item1', 
        'rand' => 10
        ],
    '2' => [
        'name' => 'item2', 
        'rand' => 20
        ],
    '3' => [
        'name' => 'item3', 
        'rand' => 30
        ],
    '4' => [
        'name' => 'item4', 
        'rand' => 40
        ],
];

function wrand($data) {

    foreach ($data as $value) {
        $itemsRand[] = $value ['rand'];
    }

    $totalw = array_sum($itemsRand);
    $rand   = rand(1, $totalw);

    $curw   = 0;
    foreach ($data as $val) {
        $curw += $val['rand'];
        if ($curw >= $rand) return $val['name'];
    }

    return end($data);
}

进一步的代码只需调用wrand()函数100次并计算结果。

static $item1 = 0;
static $item2 = 0;
static $item3 = 0;
static $item4 = 0;

for ($i = 0; $i < 100; $i++){
    $k = wrand($items);

    if ($k == 'item1') {
        $item1++;
    } elseif ($k == 'item2'){
        $item2++;
    } elseif ($k == 'item3'){
        $item3++;
    } elseif ($k == 'item4'){
        $item4++;
    }
}

echo "item1 = $item1<br>";
echo "item2 = $item2<br>";
echo "item3 = $item3<br>";
echo "item4 = $item4";