发布于 2026-01-06 3 阅读
0

理解加权随机算法

理解加权随机算法

想象一下,你有一组物品,每件物品都有不同的“权重”,或者说被选中的概率。加权随机算法是一种根据物品权重从这组物品中选择物品的方法,本质上就是赋予权重较高的物品更大的被选中概率。在本文中,我将探讨这种算法的工作原理。

应用

加权随机算法可应用于计算机科学和数据处理领域。以下列举一些常见应用场景:

  • 随机选择:使用此算法选择具有不同概率的项目,例如选择要在在线广告中显示的广告,其中点击率不同的广告权重也不同。

  • 游戏开发:在游戏中,你可以应用此算法来创建随机事件或为不同的结果分配概率,例如角色/物品掉落或敌人行为。

  • 负载均衡:在负载均衡场景中,当需要将请求分配到多个服务器时,可以使用加权随机选择,根据不同服务器的容量或性能,将更多或更少的请求分配给它们。

  • 推荐系统:推荐引擎采用加权随机算法,根据用户偏好和内容相关性对内容进行优先级排序和呈现。
    内容变体的相关性得分越高,其向用户展示的次数就越多。

概念

为了理解加权随机算法,我们可以将其想象成一个空间,其中每个区域代表一个元素的权重。这个空间类似于一条线,线上每段的长度都对应着一个元素的权重。如果你向这个空间中扔一块石头,石头落在特定区域的概率与该区域的长度成正比,而与区域的顺序无关。

图片描述

加权随机算法的实现

function randomByWeight(values: string[], weights: number[]): string {
  let total = 0

  // Sum total of weights
  weights.forEach(weight => {
    total += weight
  })

  // Random a number between [1, total]
  const random = Math.random() * total // [0,total]

  // Seek cursor to find which area the random is in
  let cursor = 0
  for (let i = 0; i < weights.length; i++) {
    cursor += weights[i]
    if (cursor >= random) {
      return values[i]
    }
  }
  return "never go here"
}

Enter fullscreen mode Exit fullscreen mode

解释该算法

1. 计算总重量

加权随机算法的第一步是确定总权重。这可以通过将集合中所有元素的权重相加来实现。在我们的例子中,总权重为 20 + 30 + 50 = 100。

let total = 0

weights.forEach(weight => {
  total += weight
})
Enter fullscreen mode Exit fullscreen mode

2. 生成随机数

接下来,我们生成一个介于 1 到总重量之间的随机数([1,total])。这个随机数就是我们的“光标”,它决定了石头在我们空间中的落点。

const random = Math.ceil(Math.random() * total) // [1,total]

Enter fullscreen mode Exit fullscreen mode

3. 走过这个空间

然后,我们遍历这个空间,将光标从左向右移动,每次移动的步长都乘以一个元素的权重。目标是当光标的移动步长超过或等于之前生成的随机数时停止。

let cursor = 0
for (let i = 0; i < weights.length; i++) {
    cursor += weights[i]
    if (cursor >= random) {
      return values[i]
    }
}
Enter fullscreen mode Exit fullscreen mode

简单解释

Weighted random algorithm可以比作一个,space其中每个都area对应于weight of an element

该算法的实现包括在该空间内选择一个随机点,并确定该点所在的具体区域。

文章来源:https://dev.to/jacktt/understanding-the-weighted-random-algorithm-581p