生成具有概率的随机整数

时间:2012-01-16 08:19:39

标签: javascript random probability

我对如何使用概率生成整数值感到困惑。

作为一个例子,我有四个整数的概率值:1 | 0.4,2 | 0.3,3 | 0.2,4 | 0.1

如何在考虑其概率的情况下生成这四个数字?

6 个答案:

答案 0 :(得分:33)

这是一个有用的技巧: - )

function randomWithProbability() {
  var notRandomNumbers = [1, 1, 1, 1, 2, 2, 2, 3, 3, 4];
  var idx = Math.floor(Math.random() * notRandomNumbers.length);
  return notRandomNumbers[idx];
}

答案 1 :(得分:24)

一种简单的天真方法可以是:

function getRandom(){
  var num=Math.random();
  if(num < 0.3) return 1;  //probability 0.3
  else if(num < 0.6) return 2; // probability 0.3
  else if(num < 0.9) return 3; //probability 0.3
  else return 4;  //probability 0.1
}

答案 2 :(得分:12)

基于@bhups答案的更灵活的解决方案。这使用概率值数组(权重)。权重的总和&#39;元素应该等于1.

var weights = [0.3, 0.3, 0.3, 0.1]; // probabilities
var results = [1, 2, 3, 4]; // values to return

function getRandom () {
    var num = Math.random(),
        s = 0,
        lastIndex = weights.length - 1;

    for (var i = 0; i < lastIndex; ++i) {
        s += weights[i];
        if (num < s) {
            return results[i];
        }
    }

    return results[lastIndex];
};

答案 3 :(得分:4)

我建议使用连续检查概率和随机数的其余部分。

此函数首先将返回值设置为最后一个可能的索引并迭代,直到随机值的其余部分小于实际概率。

概率必须加到一。

function getRandomIndexByProbability(probabilities) {
    var r = Math.random(),
        index = probabilities.length - 1;

    probabilities.some(function (probability, i) {
        if (r < probability) {
            index = i;
            return true;
        }
        r -= probability;
    });
    return index;
}

var i,
    probabilities = [0.4, 0.3, 0.2, 0.09, 0.01 ],
    count = {},
    index;

probabilities.forEach(function (a) { count[a] = 0; });

for (i = 0; i < 1e6; i++) {
    index = getRandomIndexByProbability(probabilities);
    count[probabilities[index]]++
}

console.log(count);

答案 4 :(得分:0)

这是我发现最灵活的解决方案,可以在任何具有概率的对象集中进行选择:

// set of object with probabilities:
const set = {1:0.4,2:0.3,3:0.2,4:0.1};

// get probabilities sum:
var sum = 0;
for(let j in set){
    sum += set[j];
}

// //choose random integers:
console.log(pick_random());

function pick_random(){
    var pick = Math.random()*sum;
    for(let j in set){
        pick -= set[j];
        if(pick <= 0){
            return j;
        }
    }
}

答案 5 :(得分:0)

let cases = {
  10 : 60,// 0-10 : 60  => 10%
  90 : 10,// 10-90 : 10  => 80%
  100 : 70,// 90-100 : 70 => 10%
};
function randomInt(){
  let random = Math.floor(Math.random() * 100);
  for(let prob in cases){
    if(prob>=random){
      return cases[prob];
    }
  }
}
console.log(randomInt())