星露谷物语吧 关注:429,004贴子:2,662,702

源代码分析 探究每日幸运和buff幸运的相对影响程度

只看楼主收藏回复

最近有萌新提问幸运buff和每日幸运对事件的影响差距到底有多大?和吧友产生了一些争执,虽然我直接应用wiki对幸运的描述但确实wiki也没有解释这个数据是怎么来的。于是打算直接看看源代码。
首先展示wiki提出的幸运模型



简单来说幸运分为每日幸运和buff幸运,每**uff是一个[-0.1, 0.1]中的随机数。对于一些事件两者共同影响发生概率,对于一些事件其中一者影响。但wiki表示:
A 0.01 increase in daily luck generally means a random event is about 1% more likely to happen.
A luck buff of +1 means a random event is roughly 1% more likely to happen. Any luck buff is treated separately from daily luck, so the effects of the two types of luck are not automatically the same; both the types of events affected by luck buffs and the magnitude of the effect can be different.
这话有几层意思:
对大多数事件而言,我们可以套用简单的模型:
第一层,每0.01每日幸运会让随机事件有额外1%概率发生
第二层,每1 buff幸运会让随机事件有额外1%概率发生
第三次, 两种幸运不相互覆盖
第四层,对于受幸运影响的事件,每日幸运和buff幸运影响的程度可能不同;一方面这符合第一层第二层意思,另一方面某些事件可能有额外的系数调整两种幸运的影响程度
对于有额外系数调整影响程度事件,本贴将在最后对这些特殊情况进行粗略的分析。本贴的主旨是证明在非特殊形况下,两者的影响比例确实是1比100


IP属地:浙江1楼2021-01-30 05:12回复
    上github,我是直接搜源码。也可以用reflector反编译但我嫌麻烦



    大概还有一百多个文件我没放出来,我看了大概五六十个可能含有luck关键词的文件。长的文件动不动上万行,看了我一个多小时,头晕眼花。


    IP属地:浙江2楼2021-01-30 05:19
    收起回复
      先上最关键的证据
      看到Game1.cs文件,这个文件是1.5.4版本的 五天前才更新过,所以可以保证时效性
      在这个文件的第8243行,我们可以看到每日幸运是如何计算的


      这个函数可以简化为 min(0.1, (double)random(-100, 101)/1000)
      也就是说在0.1和(double)random(-100, 101)/1000之间取较小的值
      (double)表示random(-100, 101)/1000的类型是双精度浮点数
      random(-100, 101)表示在-100和101之间随机生成一个数
      除了1000就相当于在-0.1到0.101之间随机选一个数。这个时候就能显示出前面min函数的价值,一旦这个数大于0.101就会取0.1和这个数之中较小的,也就是0.1
      也就是说这一行实际上是说每日幸运是-0.1到0.1之间的一个双精度浮点数,和wiki上的定义是完全一致的。


      IP属地:浙江3楼2021-01-30 05:30
      回复
        我的天,楼主太***
        先收藏了,等待更新。


        IP属地:湖南来自Android客户端4楼2021-01-30 06:13
        回复
          虽然wiki和我选的是同一种定义,但确实这个定义存在歧义,而且甚至这个值有时不是50也不是100
          看到同样是最新的event.cs的第417行


          这一行有一个itemlose rate,应该指的是死亡后的物品丢失概率
          itemlose rate = 0.25 - buff幸运*0.05 - 每日幸运
          可以看到这里的相对影响比例是20.
          我不太确定这指个概率是指对于每个物品独立还是对所有物品,还是这是个基础概率但是物品之间互相影响。
          但可以确定的是 不管哪个情况,如果每个物品丢失概率都是0,那一定是什么东西都不丢的。
          这就会得出一个有趣的结论,每日幸运是铱星,金星或者绝对中立,那只要吃一个棒棒糖(+5buff幸运),丢失物品概率就大于等于0。有兴趣的同学可以试试,当然不保证 在另外哪个文件调整了这个概率,或者调用的时候改了。
          ps:绝对中立和中立是不一样的,绝对中立代表每日幸运刚好是0. 中立代表每日幸运是-0.02到0.02之间的一个非0的数


          IP属地:浙江6楼2021-01-30 06:33
          收起回复
            有时候这个比例甚至还要小,不过已经属于比较边缘的特殊情况了
            在Locations文件夹里的MineShaft.cs文件第2361

            结合语境来看应该是在沙漠矿洞130层之后(也有可能是10层,取决于现版本沙漠矿洞一层还算不算矿洞121)
            有一个双倍获取宝石的参数 这个参数是0.01 + 每日幸运/10 + 幸运buff/100
            两者的相对影响率高达1比10,那这里就容易产生一个误区了。如果幸运buff这么有效,是不是猛叠幸运buff对这些相对比高的事件会很有效呢。并不一定,这个有效只是相对每**uff有效,如果两者前面乘的系数都很小,那么两者造成的影响就都很小。拿这里来举例,这个满铱星幸运 + 10幸运buff依然只有可怜的12%概率


            IP属地:浙江7楼2021-01-30 07:11
            回复
              看不懂 但好*


              IP属地:广东来自iPhone客户端8楼2021-01-30 07:44
              收起回复
                同样是Locations文件夹里的MineShaft.cs文件
                看到第3126和3135

                3126行也用了哪个经典的chanceModifier,足以见得那并不是个个例,确实说wiki所说可以用来估计通常情况。
                3135行是一个特殊但是非常非常关键的常数,这里着重进行说明
                这个参数代表了在矿洞里出现下层楼梯的概率
                stonesLeftOnThisLevel --
                double chanceForLadderDown = 0.02 + 1.0 / (double)Math.Max(1, stonesLeftOnThisLevel) + (double)who.LuckLevel / 100.0 + Game1.player.DailyLuck / 5.0;


                IP属地:浙江10楼2021-01-30 08:42
                回复
                  这两行代码其实是模拟砸开一块石头的情况,首先让当前层楼梯总数减少1,然后判定是否出现楼梯
                  楼梯出现概率 =0.02 + 1/max(1, 这层剩余石头数) + 幸运buff/100 + 每日幸运/5
                  首先这个倍率不是50也不是100,而是20或者也能理解成40(取决于定义)
                  首先,符合直觉的,一层敲的石头越多 每次敲石头出现的概率越大。也就是说这个在你发现楼梯之前,并不是有一块或者几块石头底下藏着楼梯,而是你一稿子下去,系统判断要不要在你铲的地方原地刷一个楼梯。 基础概率有百分之2。


                  IP属地:浙江11楼2021-01-30 08:43
                  回复
                    假设这一层有x块石头
                    最倒霉的情况:每日幸运-0.1,幸运buff0, 楼梯出现概率就是当前的1/x。由于挖石头的目的是挖到一个楼梯为止,所以可以理解为连续同一个试验直到出现一次成功。但这并不是经典的几何分布,因为每次抽取不是伯努利实验,而是有着越来越高的概率。
                    但是这其实也是一种很好算的模型,一次成功的概率1/x, 两次成功(x-1 /x) * (1/x-1) = 1/x, 三次成功的概率(x-1/x) * (x--2/x-1)* 1/x-2 = 1/x 可以看到前一项的分子和后一项的分母可以消掉,最后只剩第一项分母x和最后一项分子1,所以几次成功的概率都是1/x, 那么期望就是x/2次
                    也就是说运气最坏的情况下,每层x块石头,平均要敲掉一半才能出楼梯


                    IP属地:浙江12楼2021-01-30 08:44
                    收起回复


                      疯狂吞楼,直接发图


                      IP属地:浙江15楼2021-01-30 08:48
                      回复
                        总结一下,对于50块石头的一层来说:
                        最坏运气情况:平均需要挖25次出楼梯
                        较好运气(铱星好运 料理加2运气): 平均需要挖15块石头
                        最好运气 (铱星好运随机到0.1 棒棒糖+双幸运戒指+幸运饮料一共 8buff幸运):平均需要挖7块石头
                        对于100块石头的一层来说:
                        最坏运气情况:平均需要挖50次出楼梯
                        较好运气(铱星好运 料理加2运气): 平均需要挖18块石头
                        最好运气 (铱星好运随机到0.1 棒棒糖+双幸运戒指+幸运饮料一共 8buff幸运):平均需要挖8块石头


                        IP属地:浙江16楼2021-01-30 08:53
                        回复
                          (ಡωಡ)暂时完结撒花


                          IP属地:浙江来自Android客户端17楼2021-01-30 08:55
                          回复
                            所以可以粗暴的理解成一个幸运戒指=紫星幸运?


                            IP属地:四川来自Android客户端19楼2021-01-30 09:02
                            收起回复