自定义随机选取元素的机会
Customize chances of picking element randomly
我定义了两个对象:x
和 y
如果我跟随,获得 x
或 y
的机会是相等的 – 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 个以上元素的列表将需要不同的想法。
我定义了两个对象:x
和 y
如果我跟随,获得 x
或 y
的机会是相等的 – 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 个以上元素的列表将需要不同的想法。