ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript-随机播放JS数组

2019-10-24 18:36:16  阅读:225  来源: 互联网

标签:voting-system voting data-science javascript algorithm


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有