簡體   English   中英

隨機加權分布

[英]Random weighted distribution

例如我有一個數組,如:

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

和功能:

function echoRandomItem(){
}

如果我調用這個函數,它應該根據'percent'值返回項目的'name' 基本上,如果我調用這個函數 100 次,它應該返回item1 10 次, item2 20 次, item3 30 次, item4 40 次。

由於奧利弗的提示,這是我想出的解決方案。 $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";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM