【问题标题】:Run JavaScript function 70% of the time, randomly selected from an array of functions70% 的时间运行 JavaScript 函数,从函数数组中随机选择
【发布时间】:2013-12-03 19:28:17
【问题描述】:

我见过How to run a randomly selected function in JavaScript?,它允许运行从数组中随机选择的 JavaScript 函数,每次都有相同的机会(例如,如果总共有两个函数,则每个函数有 50% 的机会被执行每次)。

如何编写一个函数来说明从函数数组中随机选择的每个函数的执行概率? 如何进行加权随机化?

function randomFrom(array) {
    return array[Math.floor(Math.random() * array.length)];
}
var contentWrapper = function (target,type,articleId) {
  // list type ads
  if (type == 'list') {
    function randomListData() {
      var func = randomFrom([
        function () {
          fnNameA10(target, 'list');
        },
        function () {
          fnNameB20(target, 'list', articleId);
        }
      ]);
      (func)();
    }
    randomListData();
    // content type ads
  } else if (type == 'content') {
    function randomContentData() {
      var func = randomFrom([
        function () {
          fnNameA10(target, 'content');
        },
        function () {
          fnNameB20(target, 'content', articleId);
        }
      ]);
      (func)();
    }
    randomContentAd();
  }
};

【问题讨论】:

  • 你的意思是这个函数应该把{function:percentage}作为输入吗?
  • ...通过让您的教师查看答案键?
  • 您是否尝试进行加权随机化?
  • 你是在问如何确定一个函数在同等权重下被调用的机会,还是你在问如何衡量一个函数被调用的机会?
  • @Steve 例如:codetheory.in/…

标签: javascript jquery arrays random


【解决方案1】:

Here 是你的答案:

var rand = function(min, max) {
    return Math.random() * (max - min) + min;
};

var getRandomItem = function(list, weight) {
    var total_weight = weight.reduce(function (prev, cur, i, arr) {
        return prev + cur;
    });

    var random_num = rand(0, total_weight);
    var weight_sum = 0;
    //console.log(random_num)

    for (var i = 0; i < list.length; i++) {
        weight_sum += weight[i];
        weight_sum = +weight_sum.toFixed(2);

        if (random_num <= weight_sum) {
            return list[i];
        }
    }

    // end of function
};

var list = ['javascript', 'php', 'ruby', 'python'];
var weight = [0.5, 0.2, 0.2, 0.1];
var random_item = getRandomItem(list, weight);

【讨论】:

  • 我喜欢你原来的设置 sPaz。
  • @Emmentaler 我不知道你的回答已经被接受了。 :P 在这里,请接受我的投票...
  • @sPaz,公平地说,您在 Emmentaler 之前几秒钟提供了一个可行的解决方案(在 cmets 中),我承诺如果您提交一个答案,我会接受您的回答。再次感谢。 :)
  • 我认为这是公平的。我还是借用了他的开头:-)
【解决方案2】:

http://plnkr.co/edit/wzKp8PqNJ4Fmyo2504Cu?p=preview

var funcs = [
  {probability: 20, fn: function(){console.log("20%")}},
  {probability: 10, fn: function(){console.log("10%")}},
  {probability: 70, fn: function(){console.log("70%")}}
];

var total = 0;
var n = Math.random();
for(var i=0; i<funcs.length; ++i) {
  total+=funcs[i].probability;
  if(n*100<total) {
    funcs[i].fn.call(this);
    break;
  }
}

在这里,我得到一个介于 0 和 1 之间的随机数,然后确定该数字在数组中的位置。我通过将百分比叠加并将数字与总数进行比较来做到这一点。我需要break,因为一旦满足条件,数组中的每个元素都会返回真,我只想要第一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2014-03-27
    • 2016-05-02
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多