首页 > 解决方案 > 查找表格和整数范围 - javascript

问题描述

所以我正在寻找创建查找表。但是,我遇到了整数范围的问题,而不仅仅是 1、2、3 等。这就是我所拥有的:

var ancient = 1;
var legendary = 19;
var epic = 251;
var rare = 1000;
var uncommon = 25000;
var common = 74629;
var poolTotal = ancient + legendary + epic + rare + uncommon + common;
var pool = general.rand(1, poolTotal);



 var lootPool = {
  1: function () {
      return console.log("Ancient");
     },
     2-19: function () {

      }
    };

当然我知道2-19这行不通,但我已经尝试过其他的东西,比如 [2-19] 等等。

好的,所以有更多信息:当我打电话时:lootPool[pool]();它将选择一个介于 1 和之间的整数,具体poolTotal取决于它是否1会在控制台中记录为古代。如果它在范围内命中,2 through 19那将是传奇。依此类推我的号码。

编辑:我很清楚我可以通过开关轻松做到这一点,但我想以这种方式尝试。

标签: javascriptnode.js

解决方案


与其制作一个巨大的查找表(这很有可能,但非常不优雅),我建议制作一个(小)对象,选择一个随机数,然后在对象中找到值大于随机数的第一个条目数字:

// baseLootWeight: weights are proportional to each other
const baseLootWeight = {
  ancient: 1,
  legendary: 19,
  epic: 251,
  rare: 1000,
  uncommon: 25000,
  common: 74629,
};
let totalWeightSoFar = 0;
// lootWeight: weights are proportional to the total weight
const lootWeight = Object.entries(baseLootWeight).map(([rarity, weight]) => {
  totalWeightSoFar += weight;
  return { rarity, weight: totalWeightSoFar };
});
console.log(lootWeight);
const randomType = () => {
  const rand = Math.floor(Math.random() * totalWeightSoFar);
  return lootWeight
    .find(({ rarity, weight }) => weight >= rand)
    .rarity;
};
for (let i = 0; i < 10; i++) console.log(randomType());


推荐阅读