2013-12-03 54 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,因爲一旦條件滿足,數組中的每個元素都會返回,我只需要第一個元素。