gpt4 book ai didi

javascript - 如何增加或减少数组中某项被选中的概率?

转载 作者:行者123 更新时间:2023-12-01 15:34:29 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Javascript Get Random result with probability for specific array

(3 个回答)


2年前关闭。




因此,假设我正在制作类似于老虎机的东西,要使用我想使用的表情符号,我会将它们定义在一个数组中。

var arr = ["emoji","emoji2","emoji3","emoji4","emoji5"]

假设我希望 emojis 1 - 4 出现超过 5 个,并说降低 emoji5 被选中的概率。

我可以做一些大的事情,比如:

var arr = [
"emoji","emoji2","emoji3","emoji4",
"emoji","emoji2","emoji3","emoji4",
"emoji","emoji2","emoji3","emoji4",
"emoji","emoji2","emoji3","emoji4",
"emoji","emoji2","emoji3","emoji4",
"emoji","emoji2","emoji3","emoji4","emoji5",
]
var emoji = arr[Math.floor(Math.random() * arr.length)]

但这不是一个非常有效的想法,那么是否可以在不制作非常大的数组的情况下实现上述想法?

我的目标基本上是有一个像

var arr = ["emoji","emoji2","emoji3","emoji4","emoji5"]

它会输出一些 emojis 1 - 4 会比 emoji5 更频繁出现的东西,而没有大数组。

最佳答案

对于加权概率的一般情况,一种选择是拥有一个其键是累积概率的对象。假设您希望 emoji5 出现 4% 的时间 - 那么,累积概率将为 24、48、72、96、100(其中最后一个 96 到 100 的间隔表示 emoji5 的权重较低)。然后生成一个 1-100 之间的随机数,并找到大于所选数字的第一个 key :

const probs = {
24: "emoji",
48: "emoji2",
72: "emoji3",
96: "emoji4",
100: "emoji5"
};

const keys = Object.keys(probs).map(Number);
const generate = () => {
const rand = Math.floor(Math.random() * 100);
const key = keys.find(key => rand < key);
return probs[key];
};
for (let i = 0; i < 10; i++) {
console.log(generate());
}


另一种选择是关联 weight每个字符串的数字,并给出 emoji5一个低的,将权重相加,生成一个介于 0 和总权重之间的随机数,并找到第一个匹配项:

const weights = [
[4, 'emoji'],
[4, 'emoji2'],
[4, 'emoji3'],
[4, 'emoji4'],
[1, 'emoji5'],
];

const totalWeight = weights.reduce((a, [weight]) => a + weight, 0);
const weightObj = {};
let weightUsed = 0;
for (const item of weights) {
weightUsed += item[0];
weightObj[weightUsed] = item;
}
const keys = Object.keys(weightObj);
const generate = () => {
const rand = Math.floor(Math.random() * totalWeight);
const key = keys.find(key => rand < key);
return weightObj[key][1];
};
for (let i = 0; i < 10; i++) {
console.log(generate());
}

关于javascript - 如何增加或减少数组中某项被选中的概率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61422806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com