1

为了防止 max 的偏差每次小数范围超过max时,我都会重新计算,而不是去除小数。我认为使用random()会引入一些偏差,但这是可以接受的。

可选 arg decimal是一个整数,表示要包含多少个小数位。

可选的 arg 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
}
4

2 回答 2

1

分布是均匀的,因此如果数字超出您的范围,您可以缩放/移动伪随机数,而不是重复。

var rand = Math.random() * (max - min) + min;

这删除了您的一个 while 循环,并且应该加快代码速度。

于 2013-03-24T02:15:45.527 回答
1

这是一个更简洁的实现:

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/

变化:

  1. 将局部变量更改decimal为与参数不同的名称,以便参数有效
  2. 使用适当的范围缩放删除一个 while 循环
  3. 更改为 do/while 因此条件在计算之后才进行测试
  4. 用于===避免类型转换
  5. 从真/假计算中删除乘法和三元运算符,因为比较已经返回真/假
  6. 对不需要传递或依赖类型转换的参数进行更明确的检查null
  7. 添加相关评论
于 2013-03-24T02:58:41.427 回答