互联网上(尤其是游戏领域)经常出现针对“伪随机”的声讨,但是讨论着讨论着容易出现讨论双方乃至看客都互相不理解的场景,笔者对此非常感兴趣,于是对何为“伪随机”,有几种“伪随机”进行了研究:
1. 随机数算法局限产生的“伪随机”
问题来源:随机数生成算法是用来产生随机数的算法,理论上所有程序中有随机成分的场景的底层均是通过随机数生成来实现的,具体的随机数生成原理过于复杂,但许多随机数生成算法是通过一个随机数“种子”来生成随机数的,如果“种子”一样,则随机数生成算法生成的随机数会每次都相同(第一次学习C语言的朋友可能经历过,C语言的rand()函数如果不通过srand去更改随机数种子则每次调用产生的随机数都是一样的),一般采用当前的时间(或再经过一些运算)进行随机数的生成,而许多随机数生成算法支持生成多个不同的随机数,通过算法特性保证多个随机数之间满足真正随机数的统计特征(如均匀性、独立性等),一般的程序中采用的随机数都是通过这类算法进行生成的。但是这类算法存在一定的缺陷,如算法本质是循环周期极长的序列,生成较长序列时可能会存在一定的规律性,可能导致随机数的生成可以被预测(尽管这在一般的程序场景下几乎不可能)。
实际问题:一般而言,使用这种“伪随机”来代替完全随机的“真随机”没有任何问题,游戏玩家或程序的使用者无需对这种“伪随机”产生担心,即便或许你的抽卡随机数序列是由你的uid决定的(这意味着你抽卡的结果在一开始就已经确定好的(参考《炉石传说》回档事件中证明账号抽取卡包的稀有度在回档前后并未改变)),但是对于每个玩家而言仍是公平且未知的,不存在游戏性上的问题。
解决方法:一些特定场景下可能会使用某些专业硬件通过捕捉物理噪声点来实现无法预测的“真随机”,但成本高昂效率低下且在大多数应用场景下并无必要。
2. 暴击补偿或抽卡保底导致的“伪随机”
问题来源:对于一般玩家而言,概率这种东西理解起来比较困难,如一个角色的暴击率是20%,那么许多玩家认为连续攻击5次应该必出一次暴击,但事实上连续攻击5次不暴击的概率仍有0.8^5=32.768%之多,很不符合许多玩家的直觉,连续10次不暴击的概率都仍有近11%,如果游戏的玩家足够多,攻击次数足够多的情况下,连续50次、连续100次不暴击都是可能会发生的,但真的遇到这种情况的玩家多半不会觉得是自己运气差,而是认为游戏暴击机制出现了问题。为了提高游戏玩家的体验,许多游戏都有“暴击补偿”机制,其原理是通过修改概率算法,在攻击未造成暴击时提高下次暴击的概率,且可以叠加,这样一来可以让暴击的出现更符合玩家的直觉。而抽卡保底也是差不多的原理,有保底的抽卡的概率并非每次都相同,而是一条在抽数上升时概率会变高的曲线,《原神》在72抽左右最容易出货是有原因的,72抽附近抽到五星的概率确实比之前高不少,而能错过多次高概率抽卡达到90抽才出货的概率比第一抽就出还低。
实际问题:根据算法不同,为了保证总体概率符合预期,前几次随机的概率可能会低于标定值,但平均下来往往对玩家是有利的(实际概率略大于标定概率),暴击补偿和保底机制降低了随机的标准差,实际上降低了玩家之间的欧非差距,如果不设保底机制,那在玩家基数大的场景下1000抽都不出五星都是正常的(当然也与国家相关法律法规有相关性)。
解决方法:去除该机制即可,本身就是额外添加的机制,但是去除后只会导致运气差的玩家下限更低。
3. 固定随机数种子产生的“伪随机”
问题来源:如前文所述,随机数生成算法需要一个“种子”,而许多单机游戏(如《杀戮尖塔》)会在全局使用同一个随机数“种子”,并将其标明出来,重开游戏时可以手动输入种子来进行一把随机数完全相同的,相同操作下游戏内的随机事件等完全相同的游戏进行复盘。
实际问题:这种“伪随机”是一种很好的单机游戏机制,可以让玩家多次复盘寻找出路,也可以分享自己的对局给其他人进行体验。但也有案例,《炉石传说》之前出现过因为某些原因导致两局对局的随机数完全一致,牌堆顺序、发现的卡牌种类两局都完全一样的事件,这就是不应该产生的问题了。
解决方法:单机游戏无需解决,这是游戏的一种功能;如非故意实现则可能属于程序问题(bug),需要修复。
4. 程序出错/官方作弊产生的恶意“伪随机”
问题来源:有时因为程序错误产生了完全一样的结果的随机数,或是有明显规律的随机数,或者实际概率与标定概率不同,甚至官方在程序中恶意判断某些场景人为增加或降低概率(如某些游戏中的“红利”、“仓检”或者“智能匹配”)。这些都属于不应出现的恶意“伪随机”。
实际问题:恶性时间在游戏史上还是有不少案例的,有时是程序出错,有时是故意降低概率被氪金大佬用大数据验证发现,有时是大量对局验证概率存在明显问题。但是许多时候只是玩家的阴谋论或者幸存者偏差,很多时候玩家会记得自己运气差的时候,并加深印象,却忽略了运气好的时候,反复强化运气差的记忆,并产生出游戏概率有问题,一定是“伪随机”的想法,又因为对伪随机概念不清,与游戏中实际存在的第1、2种“伪随机”进行混淆,认为官方恶意降低概率、有作弊行为、或是“针对自己”。多数情况下只是幸存者偏差导致的错觉,大数据验证下并无问题,许多人只是不相信低概率事件会轮到自己身上。但确实也不排除存在恶意修改概率的可能性,但需要实证,也不要与前三种“伪随机”混淆大肆批判游戏存在“伪随机”,前三种“伪随机”对玩家而言并无害处,是正常游戏的机制。
解决方法:如果大量发现游戏可能存在恶意修改概率的情况,需要进行大数据验证,如果事实存在问题,可以通过官方渠道进行举报,阴谋论并无意义,也不要与正常的前三种“伪随机”进行混淆。
结论:一般而言,对于玩家有影响的是第二种和第四种伪随机,而针对第二种的暴击补偿和抽卡保底,应该认识到这是对玩家有利的平衡性保证,而第四种恶意修改概率的行为是需要抵制的,但大多数场景下并不是真的有概率恶意调整,只是玩家遭遇了小概率事件,不能接受导致的。分清认识每一种“伪随机”,理清讨论的实际内容,不至于讨论时驴唇不对马嘴。
1. 随机数算法局限产生的“伪随机”
问题来源:随机数生成算法是用来产生随机数的算法,理论上所有程序中有随机成分的场景的底层均是通过随机数生成来实现的,具体的随机数生成原理过于复杂,但许多随机数生成算法是通过一个随机数“种子”来生成随机数的,如果“种子”一样,则随机数生成算法生成的随机数会每次都相同(第一次学习C语言的朋友可能经历过,C语言的rand()函数如果不通过srand去更改随机数种子则每次调用产生的随机数都是一样的),一般采用当前的时间(或再经过一些运算)进行随机数的生成,而许多随机数生成算法支持生成多个不同的随机数,通过算法特性保证多个随机数之间满足真正随机数的统计特征(如均匀性、独立性等),一般的程序中采用的随机数都是通过这类算法进行生成的。但是这类算法存在一定的缺陷,如算法本质是循环周期极长的序列,生成较长序列时可能会存在一定的规律性,可能导致随机数的生成可以被预测(尽管这在一般的程序场景下几乎不可能)。
实际问题:一般而言,使用这种“伪随机”来代替完全随机的“真随机”没有任何问题,游戏玩家或程序的使用者无需对这种“伪随机”产生担心,即便或许你的抽卡随机数序列是由你的uid决定的(这意味着你抽卡的结果在一开始就已经确定好的(参考《炉石传说》回档事件中证明账号抽取卡包的稀有度在回档前后并未改变)),但是对于每个玩家而言仍是公平且未知的,不存在游戏性上的问题。
解决方法:一些特定场景下可能会使用某些专业硬件通过捕捉物理噪声点来实现无法预测的“真随机”,但成本高昂效率低下且在大多数应用场景下并无必要。
2. 暴击补偿或抽卡保底导致的“伪随机”
问题来源:对于一般玩家而言,概率这种东西理解起来比较困难,如一个角色的暴击率是20%,那么许多玩家认为连续攻击5次应该必出一次暴击,但事实上连续攻击5次不暴击的概率仍有0.8^5=32.768%之多,很不符合许多玩家的直觉,连续10次不暴击的概率都仍有近11%,如果游戏的玩家足够多,攻击次数足够多的情况下,连续50次、连续100次不暴击都是可能会发生的,但真的遇到这种情况的玩家多半不会觉得是自己运气差,而是认为游戏暴击机制出现了问题。为了提高游戏玩家的体验,许多游戏都有“暴击补偿”机制,其原理是通过修改概率算法,在攻击未造成暴击时提高下次暴击的概率,且可以叠加,这样一来可以让暴击的出现更符合玩家的直觉。而抽卡保底也是差不多的原理,有保底的抽卡的概率并非每次都相同,而是一条在抽数上升时概率会变高的曲线,《原神》在72抽左右最容易出货是有原因的,72抽附近抽到五星的概率确实比之前高不少,而能错过多次高概率抽卡达到90抽才出货的概率比第一抽就出还低。
实际问题:根据算法不同,为了保证总体概率符合预期,前几次随机的概率可能会低于标定值,但平均下来往往对玩家是有利的(实际概率略大于标定概率),暴击补偿和保底机制降低了随机的标准差,实际上降低了玩家之间的欧非差距,如果不设保底机制,那在玩家基数大的场景下1000抽都不出五星都是正常的(当然也与国家相关法律法规有相关性)。
解决方法:去除该机制即可,本身就是额外添加的机制,但是去除后只会导致运气差的玩家下限更低。
3. 固定随机数种子产生的“伪随机”
问题来源:如前文所述,随机数生成算法需要一个“种子”,而许多单机游戏(如《杀戮尖塔》)会在全局使用同一个随机数“种子”,并将其标明出来,重开游戏时可以手动输入种子来进行一把随机数完全相同的,相同操作下游戏内的随机事件等完全相同的游戏进行复盘。
实际问题:这种“伪随机”是一种很好的单机游戏机制,可以让玩家多次复盘寻找出路,也可以分享自己的对局给其他人进行体验。但也有案例,《炉石传说》之前出现过因为某些原因导致两局对局的随机数完全一致,牌堆顺序、发现的卡牌种类两局都完全一样的事件,这就是不应该产生的问题了。
解决方法:单机游戏无需解决,这是游戏的一种功能;如非故意实现则可能属于程序问题(bug),需要修复。
4. 程序出错/官方作弊产生的恶意“伪随机”
问题来源:有时因为程序错误产生了完全一样的结果的随机数,或是有明显规律的随机数,或者实际概率与标定概率不同,甚至官方在程序中恶意判断某些场景人为增加或降低概率(如某些游戏中的“红利”、“仓检”或者“智能匹配”)。这些都属于不应出现的恶意“伪随机”。
实际问题:恶性时间在游戏史上还是有不少案例的,有时是程序出错,有时是故意降低概率被氪金大佬用大数据验证发现,有时是大量对局验证概率存在明显问题。但是许多时候只是玩家的阴谋论或者幸存者偏差,很多时候玩家会记得自己运气差的时候,并加深印象,却忽略了运气好的时候,反复强化运气差的记忆,并产生出游戏概率有问题,一定是“伪随机”的想法,又因为对伪随机概念不清,与游戏中实际存在的第1、2种“伪随机”进行混淆,认为官方恶意降低概率、有作弊行为、或是“针对自己”。多数情况下只是幸存者偏差导致的错觉,大数据验证下并无问题,许多人只是不相信低概率事件会轮到自己身上。但确实也不排除存在恶意修改概率的可能性,但需要实证,也不要与前三种“伪随机”混淆大肆批判游戏存在“伪随机”,前三种“伪随机”对玩家而言并无害处,是正常游戏的机制。
解决方法:如果大量发现游戏可能存在恶意修改概率的情况,需要进行大数据验证,如果事实存在问题,可以通过官方渠道进行举报,阴谋论并无意义,也不要与正常的前三种“伪随机”进行混淆。
结论:一般而言,对于玩家有影响的是第二种和第四种伪随机,而针对第二种的暴击补偿和抽卡保底,应该认识到这是对玩家有利的平衡性保证,而第四种恶意修改概率的行为是需要抵制的,但大多数场景下并不是真的有概率恶意调整,只是玩家遭遇了小概率事件,不能接受导致的。分清认识每一种“伪随机”,理清讨论的实际内容,不至于讨论时驴唇不对马嘴。









