-1

例如我有一个像这样的数组:

$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 次,它应该返回item110 次、item220 次、item330 次、item440 次。

4

1 回答 1

1

感谢 Oliver 的提示,这是我提出的一个解决方案。$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";
于 2017-02-14T19:55:39.253 回答