相对于

时间:2016-12-23 14:48:23

标签: php arrays

我想为我的PHP网站制作一个轮盘赌,所以我需要设置项目的概率。所以我创建了一个具有不同项目概率的数组:

(数字越高,机会越高)

$porpList = [
0 => [
    "prop" => 10000,
    "css" => "gray"
],
1 => [
    "prop" => 1000,
    "css" => "green"
],
2 => [
    "prop" => 100,
    "css" => "blue"
],
3 => [
    "prop" => 10,
    "css" => "violet"
],
4 => [
    "prop" => 1,
    "css" => "yellow"
],
5 => [
    "prop" => 0.1,
    "css" => "orange"
]];

现在出现了困难的部分:具有更高级别的用户应该有更大的机会获得更好的项目和更低的机会获得垃圾项目,因此在级别1的概率将是:

10000
1000
100
10
1
0.1

对于等级50,概率应该是这样的:

1
1
10000
1000
100
10

从逻辑上讲,我可以创建一个表格,其中列出了每个级别的所有可能性,但我想用公式或类似方法解决这个问题。

有没有人知道这样做的方法?

2 个答案:

答案 0 :(得分:0)

如果要实现实际算法以确定概率。我出去了。

如果你想提高人们滚动更好的东西的机会,你可以使用类似的代码;

$rarities = [
    [
        'prop'  => 100000,
        'css'   => 'gray'
    ],
    [
        'prop'  => 10000,
        'css'   => 'green'
    ],
    [
        'prop'  => 1000,
        'css'   => 'blue'
    ],
    [
        'prop'  => 100,
        'css'   => 'violet'
    ],
    [
        'prop'  => 10,
        'css'   => 'yellow'
    ],
    [
        'prop'  => 1,
        'css'   => 'orange'
    ]
];
$level = 50;
$maxProp = (100000/$level);
$won = 'gray';
for ($i=0;$i<20;$i++)
{
    $roll = random_int(0, $maxProp);
    foreach ($rarities as $rarity)
    {
        if ($rarity['prop'] < $roll)
        {
            break;
        }
        $won = $rarity['css'];
    }
    echo '<span style="color: '.$won.'; font-weight: bold; font-familiy: Arial;">'.$roll.'</span><br/>';

等级越高,好的东西就越有可能“掉落”。

答案 1 :(得分:0)

关于如何根据水平调整概率的问题,肯定有许多可以想象的不同公式。例如,您可以将水平的固定部分添加到每个概率,这将平均增加每个概率。但这种增加会对较小的概率产生重大影响,而对较大概率的影响则可以忽略不计。

function getProps($propList, $level) {
    return array_map(function($row) use ($level) {
        $row['prop'] += $level/50; // adapt factor as desired
        return $row;
    }, $propList);
}

$adaptedPropList = getProps($propList, 50);

这将产生以下结果:

Array
(
    [0] => Array
        (
            [prop] => 10001
            [css] => gray
        )
    [1] => Array
        (
            [prop] => 1001
            [css] => green
        )
    [2] => Array
        (
            [prop] => 101
            [css] => blue
        )
    [3] => Array
        (
            [prop] => 11
            [css] => violet
        )
    [4] => Array
        (
            [prop] => 2
            [css] => yellow
        )
    [5] => Array
        (
            [prop] => 1.1
            [css] => orange
        )
)

为了根据这些概率实际选择随机CSS值,您可以使用此函数:

function pickRandom($propList) {
    $sum = array_reduce($propList, function($sum, $row) {
        return $sum + $row['prop'];
    }, 0);
    $r = lcg_value() * $sum;
    foreach($propList as $row) {
        $r -= $row['prop'];
        if ($r < 0) return $row['css'];
    }
}

$css = pickRandom($adaptedPropList);