2013-12-03 3 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 Вот, возьмите мой upvote ... – sPaz

+0

@sPaz, честно говоря, вы предоставили рабочее решение (в комментариях) за несколько секунд до того, как Эмменталер и я пообещали принять ваш ответ, если вы его подали. Еще раз спасибо. :) – 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, потому что каждый элемент в массиве вернется в исходное состояние после выполнения условия, и мне нужен только первый.

Смежные вопросы