如果[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)),我更倾向于使用通用解决方案。
答案 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