小样本大概率事件的正确处理方式 - 1. 概率的含义和误差产生的原因

博客探讨了在游戏中处理小样本概率事件的问题,指出小样本统计可能会与期望概率相差较大。提出通过限制触发次数为概率乘以样本数,并加入波动值进行‘可控随机化’的解决方案,以改善概率分布并使其更接近期望值。文章还强调了此方法适用于概率性事件的概率约束,但实际应用需谨慎。
摘要由CSDN通过智能技术生成

问题描述

在很多时候——特别是在游戏中——我们经常需要对某一事件进行随机触发处理,例如:攻击有几率触发暴击,怪物有几率掉出装备,武器有几率强化失败。通常我们的做法就是,从0~1中取随机数,然后判断是否大于给出的几率(实际上大多数时候为了计算效率会用0~100的随机整数)。

当我们从整个游戏世界上去统计这个随机事件时,无论这个概率是小概率还是大概率,得到的结果与我们的期望都不会有很大的差别。但是从单一玩家的角度,或者是某一短时间段的角度去统计这个事件时,对于结果的直观感受会有很大的波动性——换句话说,得到的实际概率往往并不是我们所想要的概率。

实际上从概率论的角度能给出非常合理的解释,期望方差标准差啥的一套公式概念拿出来,似乎就“原来如此”了。但是我们要的是直观的解释和合理的算法,而不是一堆晦涩难懂的公式概念。

问题分析

举个栗子:
玩家在攻击时有30%的几率触发暴击。从游戏世界中统计一个大样本,得到的触发概率基本不会与预期有很大的差别。但是对于一个玩家十次攻击的结果来说呢?
这里写图片描述
从上图模拟能很明显看到,对于一个小样本模拟,其概率与我们的期望相差甚远。你完全能够脑补出玩家在心中反复念叨的“我擦,这人品”。事实上,0/10或者10/10这样的样本,在独立随机事件中是完全合乎逻辑的。初中课本上就出现过的概念:对于独立随机事件,任何一次事件都不会影响到另一次事件的发生。

煎蛋一菊花的解释就是:概率值的本质上是对一个样本中某个特定事件的统计计算结果,而并非对某一事件是否发生的约束条件。样本和事件是前提,概率才是结果,反过来从某一统计概率上去预测样本事件的发生情况,并不能得到我们所想要的结果(所以彩票预测和股票周四会涨啥的完全就是扯淡)。

从心理感官方面,如果是一个概率非常小的事件,我们并不会从小样本上去分析,千分之一的概率在一百次中出现一次以上的概率太小,而在一千次中没有一次出现,或者出现了两次,看起来都并没有什么奇怪。所以我们需要解决的,是“小样本大概率事件”在程序中的逻辑优化。

解决方案

首先,我们有一个随机概率P,要让其在样本数量S中体现出来,我们必须将事件触发的次数限制为P*S。也就是说,我们需要将S次样本大小为1的发生概率为P的独立重复随机事件,变成一次样本大小为S的,触发次数为P*S的事件,从而把该样本的统计概率约束在P

但是,作为一个合理的随机事件,“随机”是必须存在一定概率波动的,只是独立重复随机事件的“随机”并不可控,所以我们无法将波动控制在我们的可接受范围内。而对固定次数的事件做优化,给定一个波动值D,将触发次数变成P*S ±D中的随机数,那么就能够对该事件进行“可控随机化”了。

需求分析

初始化参数

  1. 样本数量quantity;
  2. 期望次数expectation;
  3. 波动大小deviation;

公共接口

  1. bool GetNext():下次事件是否触发;
  2. void Reset():重新计算随机事件;
  3. void Reset(int deviation):以给定的波动值重新计算随机事件;

逻辑流程

  1. 以expectation和deviation得出一个随机数作为样本中触发事件数量count;
  2. 从0到quantity中取count个随机数保存到s
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值