自定义随机选取元素的机会

Customize chances of picking element randomly

我定义了两个对象:xy
如果我跟随,获得 xy 的机会是相等的 – 2 中的 1 个:

var primary = [x, y];
var secondary = primary[Math.floor(Math.random() * primary.length)];

这需要 3 的 1(较小)机会获得 y:

var primary = [x, x, y];
// secondary unchanged

等等

但我认为,这是不好的做法,因为如果我想设置获得 y 的无限小机会(例如 1e9 中的 1 个),我会做这样极度浪费的事情:

var primary = new Array();
for (i = 1e9 - 1; i--; i) primary.push(x);
primary.push(y);
var secondary = primary[Math.floor(Math.random() * primary.length)];

在 JavaScript 中有更好的方法吗?

在不深入研究 ECMAScript 规范及其实际实现的情况下,Math.random() 似乎可以顺利地生成范围 0..1 中的数字。这意味着该数字有 50% 的可能性小于 0.5、25% 的可能性小于 0.25、10% 的可能性小于 0.1,等等

要获得 x 17% 的时间(相反,y 83% 的时间),可以使用相应的号码作为 Math.random() 的网关的结果:

const x = "x";
const y = "y";

function getRandom() {
  return Math.random() < 0.17 ? x : y;
}

const value = getRandom();
// 17% "x", 83% "y"

这适用于两个值,但处理 3 个以上元素的列表将需要不同的想法。