木匣子

Web/Game/Programming/Life etc.

不同概率模型的抽奖体验

游戏中大量使用概率模型来决定事件,而不同的概率模型会带来不同的感受。以下列举了一些常见的概率模型在抽奖中的应用以及产生的体验。

普通概率模型

策划希望平均每 10 次抽奖能中一次,则每次抽奖中奖率为 10%

使用普通概率模型可以用以下程序模拟:

function roll(probability) {
    return Math.random() <= probability;
}

roll(0.1);

经过模拟统计,可以得到如下数据:

抽奖次数  10000
设定中奖率 10%
中奖次数约 10000 * 10% = 1000
两次中奖的平均间隔   10
标准差 9.62
实际期望 10%

普通概率模型是最常用的一种模型,但是在游戏运营过程中的确发现很多小白玩家不能正确理解——他们认为中奖率 10% 的设定等同于抽 10 次肯定会中一次。这显然是错误的,普通概率模型的中奖抽奖次数是基于正态分布的,而且每次抽奖的事件是独立的,并不会因为你前面抽了 9 次没中奖,第十次就一定能中奖。

虽然在大量的统计中,两次中奖的平均间隔是 10 次,但是还有一个有趣的数据是连续 10 次都没中奖的概率约为 (1-10%)^10 ~= 34.8% 可不小呢。

此外「标准差」是一个很有意思的数据,经过模拟统计,10% 中奖率得到的标准差为 9.62 ——也就是说绝大分部人经过 10 ± 9.62 次抽奖即能中奖,运气再背抽 20 次也差不多能得到奖励了。

这种概率模型能非常准确地实现策划的需求,但是会惹来一些小白玩家的差评——为什么你说中奖率是 10% 但是我抽了 20 次还没有中奖!然后给你打个一星。所以很多游戏运营商为了顾及玩家的体验,会对普通概率模型进行修订,增设一些保底抽奖次数,例如每第 10 次固定中奖(10,20,30…)

对于这种做法,我暂不于评价。但是让我们看看如果硬生生地加入固定中奖的设定,会给数值带来什么变化吧。

固定中奖模型

每次抽奖中奖率依旧为 10% ,但每第十次抽奖必中。

程序中需要增加计数器,来标记玩家的累计抽奖次数:

var count = 0;

function roll(probability, threshold) {
    count++;
    if (count % threshold == 0)
        return true;
    else
        return Math.random() <= probability;
}

roll(0.1, 10);

经过模拟统计,可以得到以下数据:

抽奖次数 10000  
中奖次数约 10000 / 10 + (10000 - 10000 / 10) * 10% = 1900  
两次中奖的平均间隔约 5.26  
标准差 3.26  
实际期望 19%

这时候玩家得到的抽奖体验是:10 次抽奖肯定能中奖,而且不止中一次,爽暴了是不是。实际期望高达 19% 这远远超出策划 10% 的预期。所以策划琢磨着不能便宜了玩家,只能把中奖率调低。但是这会导致中奖集中在每 10 次附近,抽奖的乐趣几近丧失。

这样看来,固定中奖模型是否真的无药可救?其实还是有可以优化的地方。

计数器模型

每次抽奖中奖率依旧为 10% ,若连续 9 次未中奖,下一次抽奖必中奖。

这个需求看起来和上面好像没什么不同,但是保底的条件不再是每第 10 次,而是发生在每连续 9 次未中奖后。也就是说计数器会在每次中奖后清 0 重计。

var count = 0;

function roll(probability, threshold) {
    var result = false;

    count++;
    if (count % threshold == 0)
        result = true;
    else
        result = Math.random() <= probability;

    if (result)
        count = 0;

    return result;
}

roll(0.1, 10);

经过模拟统计,可以得到以下数据

抽奖次数 10000
中奖次数约 1533(使用程序统计)
两次中奖的平均间隔约 6.51
标准差约 3.39
实际期望约 15.3%

不同于前两个模型的中奖次数可以很直观地列出公式来,这里只能用「蒙特卡罗方法(Monte Carlo method)」写程序模拟统计出实验数据;

玩家的体验依然是 10 次抽奖肯定能中奖,而且不止中一次。但是我们在没有改变概率的情况下将期望降了下来。此外玩家不会有每第 10 次抽奖一定中奖的刻板印象。缺点是这个模型很难一次到位地调出想要的期望概率,需要不停的尝试修改参数并模拟。

但这样真的好玩吗?反正我不觉得。

其它

其实还有很多有意思的抽奖模型可以琢磨,例如「随机步长累加模型」也是一种保底中奖模型,只不过去掉了独立随机事件,并把计数增长改为随机量,最终在累计超过阈值时得奖。

这种模型如果有个较大的阈值和较小的步长下限,还可以起到让玩家在头几次抽奖必然不中(大)奖的效果。另外在这种模型下,计数器甚至可以对玩家可见,让看玩家看到进度和目标,感受到奖励是可达的、近在眼前的。

除了抽奖,这种模型也经常出现在一些游戏机制里,例如装备锻造(亡灵杀手:夏侯惇)、踩地雷(宠物小精灵)等。