首先,我们定义一个接口来表示项目,并创建一个包含权重的物品列表。
interface Item {
name: string;
weight: number;
}
const items: Item[] = [
{ name: "普通药水", weight: 70 },
{ name: "稀有药水", weight: 20 },
{ name: "传奇药水", weight: 10 }
];
接下来,我们实现一个函数来根据权重进行随机选择。
function weightedChoice(items: Item[]): string {
// 计算总权重
const totalWeight = items.reduce((sum, item) => sum + item.weight, 0);
// 生成一个0到总权重之间的随机数
const randomNum = Math.random() * totalWeight;
// 根据随机数选择项目
let cumulativeWeight = 0;
for (const item of items) {
cumulativeWeight += item.weight;
if (randomNum < cumulativeWeight) {
return item.name;
}
}
// 保险措施:如果没有选中任何项目(理论上不应该发生),返回第一个项目
return items[0].name;
}
// 示例调用
const results: { [key: string]: number } = {};
for (let i = 0; i < 100; i++) {
const chosenItem = weightedChoice(items);
if (results[chosenItem]) {
results[chosenItem]++;
} else {
results[chosenItem] = 1;
}
}
console.log(results);
114

被折叠的 条评论
为什么被折叠?



