如何提高或降低数组中某项被选中的概率?[重复]

问题描述 投票:1回答:1

所以,比如说我在做一个类似老虎机的东西,要使用我想使用的表情符号,我会把它们定义在一个数组中。

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

比方说,我希望表情符号1 - 4比5出现得更多,并说减少表情符号5被选中的概率。

我可以做一些大的比如。

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"]

它将输出一些表情符号1 - 4比emoji5出现的频率要高的多的东西,而不需要一个大的数组.所以,假设我做了一个像老虎机一样的东西,要使用我想使用的表情符号,我会在一个数组中定义它们.

javascript probability
1个回答
6
投票

对于一般加权概率的情况,一种选择是有一个对象的键是累积概率的。假设你想让emoji5在4%的时间内出现--那么,累积概率将是24、48、72、96、100(其中最后一个区间96到100表示emoji5的低权重) 。然后在1-100之间生成一个随机数,并找到第一个大于所选数字的密钥。

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());
}

1
投票

用这个方法试试

var arr = ["emoji","emoji2","emoji3","emoji4","emoji5"]
var emoji = arr[Math.floor(Math.random() * (Math.random() < 0.75 ? arr.length - 1 : arr.length))]
© www.soinside.com 2019 - 2024. All rights reserved.