вероятность в javascript поможет? - PullRequest
8 голосов
/ 21 октября 2010

Извините, я новичок в JS и, похоже, не могу понять: как бы я оценил вероятность?

Я понятия не имею, но хотел бы что-то сделать: из100% -ый шанс, возможно 0,7% -ный шанс выполнить функцию e(); и 30% -ый шанс выполнить функцию d(); и т. Д. - они добавят до 100% точно с различными функциями для каждого, но я не понялкак именно это сделать в любой форме.

То, что я обнаружил, - это в основном странные учебники по математике для средней школы, работающие на Javascriptkit или что-то в этом роде.

Ответы [ 6 ]

16 голосов
/ 21 октября 2010

Например, мы определяем количество функций

function a () { return 0; }
function b () { return 1; }
function c () { return 2; }

var probas = [ 20, 70, 10 ]; // 20%, 70% and 10%
var funcs = [ a, b, c ]; // the functions array

Эта универсальная функция работает для любого количества функций, она выполняет ее и возвращает результат:

function randexec()
{
  var ar = [];
  var i,sum = 0;


  // that following initialization loop could be done only once above that
  // randexec() function, we let it here for clarity

  for (i=0 ; i<probas.length-1 ; i++) // notice the '-1'
  {
    sum += (probas[i] / 100.0);
    ar[i] = sum;
  }


  // Then we get a random number and finds where it sits inside the probabilities 
  // defined earlier

  var r = Math.random(); // returns [0,1]

  for (i=0 ; i<ar.length && r>=ar[i] ; i++) ;

  // Finally execute the function and return its result

  return (funcs[i])();
}

Например,давайте попробуем с нашими 3 функциями, 100000 попыток:

var count = [ 0, 0, 0 ];

for (var i=0 ; i<100000 ; i++)
{
  count[randexec()]++;
}

var s = '';
var f = [ "a", "b", "c" ];

for (var i=0 ; i<3 ; i++)
  s += (s ? ', ':'') + f[i] + ' = ' + count[i];

alert(s);

Результат на моем Firefox

a = 20039, b = 70055, c = 9906

Итак a работает около 20%, b ~ 70% и c ~ 10%.

Редактировать следующие комментарии.

Если у вашего браузера кашель с return (funcs[i])();, просто замените массив funcs

var funcs = [ a, b, c ]; // the old functions array

на новый (строки)

var funcs = [ "a", "b", "c" ]; // the new functions array

, затем заменитепоследняя строка функции randexec()

return (funcs[i])(); // old

с этой новой

return eval(funcs[i]+'()');
4 голосов
/ 21 октября 2010

Как-то так должно помочь:

var threshhold1 = 30.5;
var threshhold2 = 70.5;
var randomNumber = random() * 100;
if (randomNumber < threshhold1) {
   func1()
}
else if (randomNumber < threshhold2) {
   func2()
}
else {
   func3()
}

Это выполнит func1() с вероятностью 30,5%, func2() с 40% и func3() с 29,5%.

Возможно, вы могли бы сделать это более элегантно, используя словарь пороговых значений для функций указателей и цикл, который находит первую запись словаря с пороговым значением, превышающим randomNumber.

1 голос
/ 23 апреля 2012
// generate cumulative distribution function from weights
function cdf(weights) {
    // calculate total
    var total = 0;
    for(var i=0; i<weights.length; i++) {
        total += weights[i];
    }
    // generate CDF, normalizing with total
    var cumul = [];
    cumul[0] = weights[0]/total;
    for(var i=1; i<weights.length; i++) {
        cumul[i] = cumul[i-1] + (weights[i]/total);
    }
    return cumul;
}

// pick the index using the random value
function selectInd(cumul,rand) {
    for(var i=0; (i < cumul.length) && (rand > cumul[i]); ++i) {};
    return i;
}

Блок кода для использования выше

// setup (do this once)
var weights = [70,20,10];
var cumul = cdf(weights)

// get the index and pick the function
var ran = Math.random(); // 0 : 1
var func = funcs[selectInd(cumul,ran)]; 

// call the function
var someArgVal = 5;
var myResult = func(someArgVal);

// do it in one line
var myResult = (funcs[selectInd(cumul,Math.random())])(someArgVal);

Упростите код вызова с помощью объекта многократного использования

function CumulDistributor(cumul,funcs) {
    var funcArr = funcs;
    var cumulArr = cumul;
    function execRandomFunc(someArg) {
        var func = funcArr[selectInd(cumulArr,Math.random())];
        return func(someArg);
    }
}

// example usage
var cdistor = new CumulDistributor(cumul,funcs);
var myResult = cdistor.execRandomFunc(someArgValue);
1 голос
/ 21 октября 2010

Посмотрите, как получить случайные числа в JavaScript, а затем, в зависимости от того, где находится это число, вызовите каждую функцию.

1 голос
/ 21 октября 2010

Похоже, что вы действительно хотите, это Javascript random () функция .

0 голосов
/ 22 апреля 2012
var decide = function(){ 
    var num = parseInt(Math.random() * 10) + 1; // assigns num randomly (1-10)
    num > 7 ? d() : e(); // if num > 7 call d(), else call e() 
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...