我应该如何在O(1)中映射连续随机变量?

时间:2014-02-26 21:55:26

标签: javascript random map statistics probability

如果[0,1]中的随机数均匀分布,我如何根据数字所在的区域来映射结果?这是一个天真的解决方案,其中包含my jsfiddle的摘要:

function mapRandomNumber(){
    var randomNumber = Math.random();
    if(randomNumber < 0.2){ // 20%
        return 0;
    } else if(randomNumber < 0.3){ // 10%
        return 1;
    } else if(randomNumber < 0.5){ // 20%
        return 2;
    } else if(randomNumber < 0.65){ // 15%
        return 3;
    } else if(randomNumber < 0.9){ // 25%
        return 4;
    } else { // 10%
        return 5;
    }
}

但是,如果我有几十个或几百个案例怎么办?这意味着数以百计的if-elses,这不是优雅的,也很难修改。

对于简单案例(对于理性概率),一个O(1)答案是取随机数,将其离散化并映射这些结果。以下是3个数字的示例:

numberMap = {
    0: 0, // 1/3%
    1: 0, // 1/3%
    2: 1 // 1/3%
}

function mapRandomNumber(){
    var randomNumber = Math.random(); // [0, 1)
    randomNumber = randomNumber*3; // [0, 3)
    randomNumber = Math.floor(randomNumber); // 0 or 1 or 2
    // returns zero 2/3 of the time, and returns one 1/3 of the time
    return numberMap[randomNumber];
}

这并不适用于非理性概率,对于大型地图来说效率可能不高,因为许多映射应该返回相同的结果。

对于任何具有恒定时间复杂度的编程语言(O(1)),我更倾向于使用通用解决方案。

1 个答案:

答案 0 :(得分:0)

var limits = [
    0.001,
    0.01,
    0.1,
    0.3,
    0.30001,
    0, // this deletes this index from the output
    0.7,
    0.9,
    1];

function mapNumber(num) {
    for (var i=0; i<limits.length; i++) {
        if (num <= limits[i])
            // here we simply map to the index, but the values in the limits
            // array could also be used to store the mapping value.
            return i;
    }
}

console.log(mapNumber(0)); // 0
console.log(mapNumber(0.000000001)); // 0
console.log(mapNumber(0.015)); // 2
console.log(mapNumber(0.4)); // 6