Javascript 生成具有概率的随机整数

Javascript 生成具有概率的随机整数,javascript,random,probability,Javascript,Random,Probability,我对如何生成具有概率的整数值有点困惑 例如,我有四个整数及其概率值:1 | 0.4,2 | 0.3,3 | 0.2,4 | 0.1 考虑到这四个数字的概率,我如何生成它们?这里有一个有用的技巧:-) 一个简单的简单方法可以是:function getRandom(){ function getRandom(){ var num=Math.random(); if(num < 0.3) return 1; //probability 0.3 else if(num < 0

我对如何生成具有概率的整数值有点困惑

例如,我有四个整数及其概率值:1 | 0.4,2 | 0.3,3 | 0.2,4 | 0.1

考虑到这四个数字的概率,我如何生成它们?

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


一个简单的简单方法可以是:
function getRandom(){
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
}
var num=Math.random(); if(num<0.3)返回1;//概率0.3 else if(num<0.6)返回2;//概率0.3 else if(num<0.9)返回3;//概率0.3 else返回4;//概率0.1
}

基于@bhups answer的更灵活的解决方案。这将使用概率值(权重)数组。“权重”元素之和应等于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];
};
var权重=[0.3,0.3,0.3,0.1];//概率
变量结果=[1,2,3,4];//要返回的值
函数getRandom(){
var num=Math.random(),
s=0,
lastIndex=权重。长度-1;
对于(变量i=0;i
我建议对概率和其余随机数进行连续检查

该函数首先将返回值设置为最后一个可能的索引,并进行迭代,直到剩余的随机值小于实际概率

概率之和必须为1

函数getRandomIndexByProbability(概率){
var r=Math.random(),
指数=概率。长度-1;
概率。一些函数(概率,i){
if(r<概率){
指数=i;
返回true;
}
r-=概率;
});
收益指数;
}
var i,
概率=[0.4,0.3,0.2,0.09,0.01],
计数={},
指数
forEach(函数(a){count[a]=0;});
对于(i=0;i<1e6;i++){
索引=getRandomIndexByProbability(概率);
计数[概率[指数]]++
}

控制台日志(计数)这是我发现的最灵活的解决方案,用于在任何一组具有概率的对象中进行拾取:

//具有概率的对象集:
常量集={1:0.4,2:0.3,3:0.2,4:0.1};
//获取概率总和:
var总和=0;
for(设j为集合){
总和+=集合[j];
}
//选择随机整数:
log(pick_random());
函数pick_random(){
var pick=Math.random()*sum;
for(设j为集合){
拾取-=设置[j];

如果(选择正确的方向,只需动态创建
notRandomNumbers
(给定数字及其权重/概率),我认为这是理想的解决方案。很好!谢谢。这正是我需要的。@ShadowWizard:是的,为了清晰起见,我简化了:-)当然,我只是在等待更多的解决方案来选择最好的一个;)不,我没有改变任何东西。我只是现在接受了你的答案,因为它比另一个解决方案更优雅。如果你想知道很多关于如何快速实现这一点的技术细节,这是一个很好的资源。要在4个选择中做出加权选择,它是不需要计数。另请参见如果两个数字的概率相同怎么办?:-)Sergio Tulentsev->轻松使用下一步之间相同的差异
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];
};