node.js - 根据百分比机会选择级别
问题描述
我有以下格式的 JSON:
"fire": {
"price": 25,
"uniques": [
23
],
"levels": {
"1": 30,
"2": 50,
"3": 10,
"4": 6.5,
"5": 2.5,
"6": 0.9,
"7": 0.1
}
}
这些级别有我需要选择的级别,以百分比机会作为值。(例如 1 级有 30% 的机会)
我需要以某种方式选择一个随机级别,同时遵循这些机会。
我试过的:把我的头撞在墙上
解决方案
这种方法会生成一个随机值,并从阈值开始1
。然后它迭代地减去每个级别的概率百分比,直到达到随机值超过阈值的级别:
const probabilities = {
"1": 30,
"2": 50,
"3": 10,
"4": 6.5,
"5": 2.5,
"6": 0.9,
"7": 0.1
};
const level = () => {
const random = Math.random();
let threshold = 1;
for (let [level, percentage] of Object.entries(probabilities)) {
threshold = threshold - (percentage / 100);
if (random >= threshold) {
return level;
}
}
}
console.log([...Array(20)].map(_ => level())); // 20 examples
如果性能是一个问题,您可以预先计算阈值。
推荐阅读
- c++ - 我应该将 malloc() 用于链接列表吗?
- checkbox - 如何使 Google 查询仅从两个不同的列中提取 TRUE 值
- visual-c++ - 为什么在编译向量时VS2017和VS代码不同?
- android - 使用自定义源代码编译和更新 Flutter 的 Dart Dart 虚拟机
- html - ItextSharp 未封闭标签
- windows - 在 windows 上使用 exec.Command 进行 noverify
- excel - 如何将数据粘贴到 VBA 的特定行中?
- c - 无法打印函数返回的字符串
- python - Sphinx autodoc 找不到模块
- ios - 使用 IP 地址(xxx.xxx.xxx.xxx)而不是 URL 向 Mysql 发送数据