javascript - Javascript 中的无偏随机范围生成器

标签 javascript random numbers range generator

为防止 ma​​x 出现偏差,每次小数范围超出 ma​​x 时我都会重新计算,而不是去除小数位。我认为使用 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/

变化:

  1. decimal 局部变量更改为与参数不同的名称,以便参数有效
  2. 通过使用适当的范围缩放移除一个 while 循环
  3. 直到计算之后才测试更改执行/同时执行条件
  4. 使用===避免类型转换
  5. 从 true/false 计算中删除乘法和三元运算符,因为比较已经返回 true/false
  6. 更明确地检查不需要传递参数或依赖类型转换为 null
  7. 的参数
  8. 添加相关评论

关于javascript - Javascript 中的无偏随机范围生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15594332/

相关文章:

javascript - Backbone.Model 保存——返回模型的子项是数组而不是 Backbone.Collection。

mysql - mysql中行组的随机顺序

javascript - 动画理论(自然动画)

python - 在python中自动处理e(科学)表示法中的数字

javascript - AJAX PHP 函数 onchange 选择框

javascript - Bokeh:将变量传递给 Widgets 的 CustomJS

javascript - 将类别树转换为平面列表的算法

java - 如何在java中为新用户自动生成登录ID?

javascript 为 0011 返回 9

algorithm - 如何编写一个函数来生成随机数 0/1 使用另一个随机函数?