概率

我说我为什么抽不到 SSR,原来是这段代码在作祟

在游戏开发的过程中,很多场景都会用到加权随机。例如游戏中的抽奖,我们有 50% 的几率获得金币、40% 的几率获得钻石、9% 的几率获得普通装备,1% 的几率获得极品装备。

什么是加权随机?当我们从某种容器中随机选择一个元素,每个元素被选中的机会并不相等,而是由相对“权重”(或概率)被选中的,也就是说我们想要有“偏心”的得到某种随机结果。举一个例子,假如现在有一个权重数组 w = {1, 2, 4, 8},它们代表如下规则。

  • $\frac{1}{(1+2+4+8)} = \frac{1}{15} \approx 6.6$ % 的机会选中索引 0

  • $\frac{2}{(1+2+4+8)} = \frac{2}{15} \approx 13.3$ % 的机会选中索引 1

  • $\frac{3}{(1+2+4+8)} = \frac{4}{15} \approx 26.6$ % 的机会选中索引 2

  • $\frac{8}{(1+2+4+8)} = \frac{8}{15} \approx 53.3$ % 的机会选中索引 3

解决方案

方案一、笨笨的办法

第一个方法是在我们的候选列表中,包含了基于权重的每个索引的预期数量,然后从该列表中随机选择。

假设现在有权重列表 {1, 2, 4, 8},那我们得到的候选列表将是 {0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3}。

然后通过 rand.Intn() ,获取一个随机数,就完成了,代码如下。

Read more