2013-12-03 35 views
1

我见过How to run a randomly selected function in JavaScript?它允许运行从数组中随机选择的JavaScript函数,每次都有相同的机会(例如,如果有两个函数在总的来说,每次执行每个函数的几率为50%)。运行JavaScript函数70%的时间,从一系列函数中随机选择

如何编写一个函数来表示执行每个函数的百分比机会,这些函数是随机可用的,可以从函数数组中选择? 我该如何做加权随机?

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(); 
    } 
}; 
+1

你的意思是,功能应该在'{功能:百分比}'作为输入? – sPaz

+1

...通过让你的老师看到答案的关键? – Adam

+4

你想加权随机化吗? –

回答

4

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); 
+0

我喜欢你原来的设置sPaz。 –

+0

@Emmentaler我不知道你的答案已被接受。 :P在这里,请接受我的赞赏... – sPaz

+0

@sPaz,公平地说,您在Emmentaler之前几秒钟提供了一个工作解决方案(在评论中),如果您提交了答案,我承诺接受您的答案。再次感谢。 :) – Steve

3

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,因为一旦条件满足,数组中的每个元素都会返回,我只需要第一个元素。