我有两个已定义的对象:x
和y
如果我关注,则获得x
或y
的机会相等 - 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中有更好的方法吗?
答案 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+ 个元素的列表需要不同的想法。