编程语言
首页 > 编程语言> > javascript-随机播放JS数组

javascript-随机播放JS数组

作者:互联网

说我有一个像这样的数组:

const alphabet = ['a', 'b', 'c', 'd'];

这代表4个政治候选人和一个等级选择投票,其中候选人a是第一选择,候选人b是第二选择,依此类推.

我想将其随机排列成一堆随机顺序,但是在这种情况下,我希望a以大约60%的价格出现在第一位,b以20%的概率出现在第二位,而c以10%的概率出现在第三位,所有其他的出现可能是10位. %.是否有一些lodash和ramda功能可以完成此任务?

这用于测试等级选择投票算法.随机地对数组进行改组产生的候选人具有几乎完全相同的投票计数,这与大多数现实情况不符(尽管我也会对此进行测试).

我有一个非常可怕的例程,它将生成一个随机数组:

const getValues = function () {

  const results = [];
  const remaining = new Set(alphabet);
  const probabilities = [0.6, 0.2, 0.1, 0.1];

  for(let i = 0; i < alphabet.length; i++){

    const r  = Math.random();
    const letter = alphabet[i];

    if(r < probabilities[i] && remaining.has(letter)){
      results.push(letter);
      remaining.delete(letter);
    }
    else{
      const rand = Math.floor(Math.random()*remaining.size);
      const x = Array.from(remaining)[rand];
      remaining.delete(x);
      results.push(x);
    }

  }

   return results;
};

这种“有效”的方法,但是由于条件概率的原因,并不能完全按照指定的概率对事物进行排序.如上所述,有人知道让订单以一定概率出现的好方法吗?

这是我正在寻找的一些示例输出:

[ [ 'd', 'b', 'a', 'c' ],
  [ 'a', 'b', 'c', 'd' ],
  [ 'a', 'd', 'b', 'c' ],
  [ 'd', 'b', 'a', 'c' ],
  [ 'b', 'c', 'a', 'd' ],
  [ 'a', 'b', 'c', 'd' ],
  [ 'd', 'b', 'c', 'a' ],
  [ 'c', 'd', 'a', 'b' ],
  [ 'd', 'b', 'a', 'c' ],
  [ 'a', 'b', 'c', 'd' ] ]

如果您生成了足够的数据,将不符合所需的订单/分布.

解决方法:

您可以使用如下所示的随机播放功能对它们进行排序:

const candidates = [
  { name: "a", weight: 6 },
  { name: "b", weight: 2 },
  { name: "c", weight: 1 },
  { name: "d", weight: 1 }
];

const randomShuffleFn = () => Math.random() - .5;

const shuffleFn = (candidateA, candidateB) =>
  Math.random() * (candidateB.weight + candidateA.weight) - candidateA.weight;

console.log([...candidates].sort(randomShuffleFn).sort(shuffleFn));

好的,这并不完全相同,但是我认为通过调整权重可以得到所需的分布(就这样,A赢得60%的次数).

标签:voting-system,voting,data-science,javascript,algorithm
来源: https://codeday.me/bug/20191024/1922726.html