【问题标题】:Randomize weighted array with weights lower than 1 and decimals随机化权重小于 1 和小数的加权数组
【发布时间】:2016-02-05 17:36:10
【问题描述】:

我有一个数组,每个值都有权重,用于根据这些权重检索随机值。我过去用过这样的东西:

$items = array( "value1" => 30, "value2" => 70 );

$weighted = array();

foreach( $items as $value => $weight ) {
    $weighted = array_merge($weighted, array_fill(0, $weight, $value));
}

echo $result = $weighted[array_rand($weighted)];

但是如果我需要在权重上使用小数怎么办? (我使用的权重总和为 100 btw)

例如:

$items = array( "value1" => 0.5, "value2" => 99.5 );

所以 value1 只会显示 0.5% 的时间。

【问题讨论】:

    标签: php arrays math random


    【解决方案1】:

    你可以这样: 首先,在您想要的精度范围内创建一个十进制随机数。 例如,创建一个介于 0 和 10.000 之间的随机整数并除以 100(在这种情况下,它的精度是逗号后面的两位数)。我们将其命名为 random_value。

    然后这样做(在伪代码中):

        given: random_value, decimal in [0,100]
        sum = 0
        for each item in items
                sum += weight(item)
                if(sum >= random_value)
                        return item
                        (and break for-loop)
    

    所以如果你得到权重 (0.5, 45.5, 50) 并且 random_value 是 46, 我们将 0.5 添加到总和中,得到 0.5,这不是 >= 46 -> 继续 我们将总和加上 45.5,得到 50,即 >= 46 -> 第二项是

    【讨论】:

    • 权重需要从低到高排序吗?
    猜你喜欢
    • 2013-11-29
    • 2014-03-26
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    相关资源
    最近更新 更多