首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何增加或降低数组中被选择的项的概率?

如何增加或降低数组中被选择的项的概率?
EN

Stack Overflow用户
提问于 2020-04-25 08:17:21
回答 2查看 385关注 0票数 4

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

代码语言:javascript
运行
复制
var arr = ["emoji","emoji2","emoji3","emoji4","emoji5"]

假设我希望emojis 1-4出现在5以上,并且减少emoji5被选中的概率。

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

代码语言:javascript
运行
复制
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)]

但是,这不是一个非常有效的想法,那么,在不制作一个非常大的数组的情况下,是否有可能做到上面的想法呢?

我的目标基本上是有一个数组,比如

代码语言:javascript
运行
复制
var arr = ["emoji","emoji2","emoji3","emoji4","emoji5"]

而且它会输出一些表情符号1-4会比emoji5更频繁出现的东西,而没有一个大数组。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-25 08:24:00

对于加权概率的一般情况,一种选择是有一个对象,其键具有累积概率。假设你想要emoji5发生4%的时间-那么,累积概率是24,48,72,96,100 (最后的间隔96到100表示表情符号5的低体重)。然后生成一个介于1-100之间的随机数,并找到第一个键,它大于所选数:

代码语言:javascript
运行
复制
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和总权重之间生成一个随机数,并找到第一个匹配:

代码语言:javascript
运行
复制
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());
}

票数 6
EN

Stack Overflow用户

发布于 2020-04-25 08:22:51

试着这样做

代码语言:javascript
运行
复制
var arr = ["emoji","emoji2","emoji3","emoji4","emoji5"]
var emoji = arr[Math.floor(Math.random() * (Math.random() < 0.75 ? arr.length - 1 : arr.length))]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61422806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档