Widziałem Jak uruchomić losowo wybraną funkcję w JavaScript?, który umożliwia uruchamianie funkcji JavaScript losowo wybrany z tablicy z równą szansą za każdym razem (np. Jeśli w sumie są dwie funkcje, istnieje 50% szansa, że każda funkcja zostanie wykonana za każdym razem).

Jak napisać funkcję, aby podać procentową szansę na wykonanie każdej funkcji, która jest losowo dostępna do wybranej z tablicy funkcji? Jak mogę wykonać ważoną randomizację?

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
Steve 3 grudzień 2013, 23:28

2 odpowiedzi

Najlepsza odpowiedź

Oto to Twoja odpowiedź:

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);
4
sPaz 3 grudzień 2013, 20:00

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;
  }
}

Tutaj otrzymuję losową liczbę między 0 a 1, a następnie określenie, gdzie ta liczba spada w tablicy. Robię to, układając procenty w górę i porównując numer do całkowitej kwoty. Potrzebuję break, ponieważ każdy element w tablicy wróci, gdy warunek jest spełniony i chcę tylko pierwszego.

3
FelixSFD 26 sierpień 2017, 14:51