【发布时间】:2014-02-26 21:55:25
【问题描述】:
给定 [0, 1) 中的均匀分布随机数,我如何根据该数字所在的区域映射结果?这是一个来自my jsfiddle 的带有sn-p 的简单解决方案:
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-else,既不优雅,也难以修改。
对于简单情况(对于有理概率),一个 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)) 的编程语言,我更喜欢通用解决方案。
【问题讨论】:
-
这是一道作业题吗?
-
parseInt()不适用于将浮点数转换为整数。在这里使用Math.floor()。 -
您是否考虑过制定一组限制,而不是离散您的频谱并制作地图?
-
这不是作业问题。这是针对个人项目的,我需要有效地生成大量随机数。是的,我会使用 Math.floor。
-
Squid,如何在没有条件的情况下以编程方式设置一组限制?有没有不使用条件的方法?
标签: javascript random map statistics probability