为防止 max 出现偏差,每次小数范围超出 max 时我都会重新计算,而不是去除小数位。我认为使用 random() 会引入一些偏差,但这是可以接受的。
可选参数 decimal 是一个整数,表示要包括多少位小数。
可选参数 exclude 用于从结果中排除特定数字(通常为 0)。
如果省略所有参数,可选择随机返回 true 或 false。
基本上,我只是想知道是否有任何方法可以提高速度和效率而不增加和更多偏差(甚至减少偏差)。似乎 while 循环可能会减慢它的速度。我将其用于动画,不希望结果有偏差(尤其是在 1.0 到 2.0 之类的小范围内)。
function random(min, max, decimal, exclude) {
if (min == null) return (Math.random()*2 >= 1) ? true : false
var decimal = (decimal == null) ? 1 : Math.pow(10,decimal), result = exclude
while (result == exclude) {
result = max+1
while (result > max) var result = Math.round((Math.random()*(max-min+1)+min)*decimal)/decimal
}
return result
}
最佳答案
这里有一个更简洁的实现:
function random(min, max, decimal, exclude) {
// if no min and max is passed, return true or false
if (arguments.length < 2) return(Math.random() >= 0.5);
// calc decimal multiplier
var factor = 1, result;
if (typeof decimal === "number") {
factor = Math.pow(10, decimal);
}
// loop until we get a value that isn't our exclude value
do {
// calc rand value in proper range
result = Math.random() * (max - min) + min;
// adjust to proper number of decimal digits
result = Math.round(result * factor) / factor;
} while (result === exclude);
return result;
}
带小数的工作演示:http://jsfiddle.net/jfriend00/SjgaW/
工作演示作为整数(排除值):http://jsfiddle.net/jfriend00/GgkJv/
变化:
- 将
decimal
局部变量更改为与参数不同的名称,以便参数有效 - 通过使用适当的范围缩放移除一个 while 循环
- 直到计算之后才测试更改执行/同时执行条件
- 使用
===
避免类型转换 - 从 true/false 计算中删除乘法和三元运算符,因为比较已经返回 true/false
- 更明确地检查不需要传递参数或依赖类型转换为
null
的参数
- 添加相关评论
关于javascript - Javascript 中的无偏随机范围生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15594332/