这对我来说是一个挑战,我该如何正确编写代码?我真的需要一些帮助来解决它...
关于加权-实际上是随机的。我会尝试用我的英语不好的方法逐步解释这个问题:)很抱歉,如果在这里给出了不必要的信息,如果有人可以简化这个过程,我会很高兴...
假设我们要根据所需的体重随机选择一个城市名称。
在这里,我们有一个包含这些城市名称的对象数组,以及我们所需的样本权重以及每个城市与西部的距离。
var list = [
{ name: "New York", distance: 4, weight: 1 },
{ name: "Atlanta", distance: 3, weight: 1 },
{ name: "Dallas", distance: 2, weight: 1 },
{ name: "Los Angeles", distance: 1, weight: 1 },
];
所以纽约很远,洛杉矶很近。好的,现在,我可以使用此功能根据城市的重量来选择城市(没有必要向您显示其背后的代码,但是如果您要查看它,可以随时询问。)
var random_item = getRandomItem(name, weight);
console.log(random_item);
此代码的结果是其中一个城市,例如纽约。
我的问题是:在拿起第一个城市后,我想要一个新的修改后的权重数组,以便:
A)给出已经拾取的城市权重0(这样就不能再次重复注意:这不是问题)。
B)使用以下逻辑,根据剩余城市与最后一个拾取城市的距离来修改权重:与离最后一个拾取城市不远的城市一样,它们的权重也会增加。 (换句话说,我想根据城市可能已经形成的最后一个城市来选择城市)
例如:如果纽约是第一个上车的城市,则纽约的权重应为0,并且距洛杉矶的距离为3(New York.distance:4 vs Los Angeles.distance:1)加Los angles.weight a 3使其变为4。
任何想法或解决方案都值得赞赏...
答案 0 :(得分:4)
以下是反映我评论的答案:
您的逻辑将无法按照您的期望进行。以亚特兰大为随机城市: 亚特兰大的权重变为:0,纽约的权重变为:
(3 - 4) + 1 = 0
-您有两个权重为零的权重。我建议不要添加当前重量。将提供一个有符号的值作为 无法重复的重量。
此答案将确保weight
属性的唯一值。您可以想到负值向西移动,而正值从零加权位置向东移动。
var list = [
{ name: "New York", distance: 4, weight: 1 },
{ name: "Atlanta", distance: 3, weight: 1 },
{ name: "Dallas", distance: 2, weight: 1 },
{ name: "Los Angeles", distance: 1, weight: 1 },
];
// Given random city is Atlanta
let randomCity = "Atlanta";
let baseDistance = list.find(l => l.name == randomCity).distance;
let newList = list.map(c => {
console.log();
let newWeight = Math.abs(baseDistance - c.distance);
return {
name: c.name,
distance: c.distance,
weight: newWeight
};
});
console.log(newList);
编辑:基于OP的评论,以及我对这种方式无法再次重复的明显误解实际上是什么意思(我认为唯一性是主意),我已将权重更改为绝对值。