【问题标题】:Customize chances of picking element randomly自定义随机选择元素的机会
【发布时间】:2016-02-01 03:15:10
【问题描述】:

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

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

这需要 3 之一(更小)的机会获得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 中有没有更好的方法来做到这一点?

【问题讨论】:

  • 只需“四舍五入”您的随机数,以便您落在一个索引上的概率高于另一个索引。没有理由为此构建一个巨大的数组。
  • @Bergi:对不起,我没听懂你的意思。
  • 只需使用primary[Math.random < 1e-9 ? 1 : 0]。当您知道哪些元素将在哪里时,没有理由实际创建数组 - 只需通过它们的虚构位置选择元素。

标签: javascript math random probability


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多