如何生成元素的随机加权分布

met*_*ate 5 javascript arrays algorithm

我想返回一个数组,它有一组根据自定义频率随机分布的独特元素.我的真实世界用例是基于对这些图像的受欢迎程度的定性权重来重复轮播图像.

例如,假设我有5个带权重的元素:

A,20%B,50%C,80%D,10%

我想编写一个函数,给定一个长度,试图近似一个序列,使C出现的频率是D的八倍; D的出现次数比B少5次; A的出现频率是C的三倍.

Dra*_*kes 7

C的出现频率是D的8倍; D的出现次数比B少5次; A的出现频率是C的三倍.

您可以使用元素的加权数组来执行此操作:

var elems = ["A", "B", "C", "D"];
var weights = [2, 5, 8, 1]; // weight of each element above
var totalWeight = weights.reduce(add, 0); // get total weight (in this case, 16)

function add(a, b) { return a + b; } // helper function

var weighedElems = [];
var currentElem = 0;
while (currentElem < elems.length) {
  for (i = 0; i < weights[currentElem]; i++)
    weighedElems[weighedElems.length] = elems[currentElem];
  currentElem++;
}

console.log(weighedElems);
Run Code Online (Sandbox Code Playgroud)

这会生成一个像这样的数组

["A","A","B","B","B","B","B","C","C","C","C","C"," C","C","C","D"]

所以你可以随意选择

var rnd = Math.floor(Math.random() * totalWeight);
console.log(weighedElems[rnd]);
Run Code Online (Sandbox Code Playgroud)

资源: