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

时间:2015-10-31 22:25:11

标签: javascript math random probability

我有两个已定义的对象:xy
如果我关注,则获得xy的机会相等 - 2 中的1个:

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

获得y的机会<1> 3 (较小):

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中有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

在不深入研究 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+ 个元素的列表需要不同的想法。