查找表和整数范围-javascript
所以我希望创建查找表。但是,我遇到了一个整数范围的问题,而不仅仅是1、2、3等。以下是我得到的:查找表和整数范围-javascript,javascript,node.js,Javascript,Node.js,所以我希望创建查找表。但是,我遇到了一个整数范围的问题,而不仅仅是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
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
,它将在控制台中记录为0。如果它在2到19的范围内命中,它将成为传奇。按照我的数字等等
编辑:我很清楚我可以用开关轻松地完成这项工作,但我想用这种方式试试。我建议创建一个(小)对象,选择一个随机数,而不是创建一个巨大的查找表(这很可能,但非常不雅),然后在对象中查找值大于随机数的第一个条目:
//基本权重:权重彼此成比例
常量基本权重={
古代:1,,
传奇人物:19岁,
epic:251,
稀有品种:1000,
不寻常:25000,
普通电话:74629,
};
让totalWeightSoFar=0;
//重量:重量与总重量成比例
const lootWeight=Object.entries(baseLootWeight).map([rarity,weight])=>{
总重量Sofar+=重量;
返回{稀有,重量:totalWeightSoFar};
});
控制台日志(重量);
常量随机类型=()=>{
const rand=Math.floor(Math.random()*totalWeightSoFar);
返回重量
.find(({rarity,weight})=>weight>=rand)
.稀有性;
};
对于(让i=0;i<10;i++)console.log(randomType())代码>这不是查找,但这可能会对您有所帮助
let loots = {
"Ancient": 1,
"Epic": 251,
"Legendary": 19
};
//We need loots sorted by value of lootType
function prepareSteps(loots) {
let steps = Object.entries(loots).map((val) => {return {"lootType": val[0], "lootVal": val[1]}});
steps.sort((a, b) => a.lootVal > b.lootVal);
return steps;
}
function getMyLoot(steps, val) {
let myLootRange;
for (var i = 0; i < steps.length; i++) {
if((i === 0 && val < steps[0].lootVal) || val === steps[i].lootVal) {
myLootRange = steps[i];
break;
}
else if( i + 1 < steps.length && val > steps[i].lootVal && val < steps[i + 1].lootVal) {
myLootRange = steps[i + 1];
break;
}
}
myLootRange && myLootRange['lootType'] ? console.log(myLootRange['lootType']) : console.log('Off Upper Limit!');
}
let steps = prepareSteps(loots);
let pool = 0;
getMyLoot(steps, pool);
让战利品={
"古":一,,
“史诗”:251,
“传奇”:19
};
//我们需要按lootType的值排序的战利品
功能准备(战利品){
让steps=Object.entries(loots.map((val)=>{return{“lootType”:val[0],“lootVal”:val[1]});
步骤.排序((a,b)=>a.lootVal>b.lootVal);
返回步骤;
}
函数getMyRoot(步骤,val){
让我的旅行;
对于(var i=0;isteps[i].lootVal&&val
当我键入此内容时,我不是有意冒犯您——我真的不明白您想要实现什么。这可能表明您需要在文章正文中提供更多的上下文,或者您缺少了一个标签,该标签可以提供对技术和目标的更多了解。就我的两分钱--也许我今天理解得太慢了。补充了更多信息。。。不确定它是否对你有帮助。不知道这些东西有什么作用,但它很有效,非常棒,谢谢!尽管如此,现在我必须弄清楚如何向它添加功能,而不仅仅是坐在稀有的名字上。如果我更改const rand=Math.floor(Math.random()*totalWeightSoFar)代码>至<代码>常数rand=20代码>它打印出传奇。它不应该打印epic吗?lootWeight
对象的值表示累积重量,任何等于或高于该值的随机数都对应一个稀有值,至少与所考虑的稀有值相同。相比之下,基本权重与稀有比率相对应,这更直观。(例如古代的
比传奇的
可能性小19倍)。如果rand
值为20,则会找到{rarity:'legendary',weight:20}
对象,因为最初的rand
是为古代
保留的。