关于javascript:负值和正值之间的随机数

Random number between negative and positive value

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Generating random numbers in Javascript in a specific range?

例如,如何获得介于-99和99之间的随机值(不包括0)?


1
2
var num = Math.floor(Math.random()*99) + 1; // this will get a number between 1 and 99;
num *= Math.floor(Math.random()*2) == 1 ? 1 : -1; // this will add minus sign in 50% of cases


这将返回您想要的

1
2
3
4
5
function getNonZeroRandomNumber(){
    var random = Math.floor(Math.random()*199) - 99;
    if(random==0) return getNonZeroRandomNumber();
    return random;
}

这是一把功能性的小提琴

编辑

为了在用户@markdickinson对我发布的第一个代码做出的确实相关的贡献中为未来的读者做出贡献,我决定对使用Math.floor()Math.round()函数返回OP想要的值进行快速比较。

第一个场景:使用var random = Math.round(Math.random()*198) - 99;(我的第一个建议)

1
2
3
4
5
function getNonZeroRandomNumberWithMathRound(){
    var random = Math.round(Math.random()*198) - 99;
    if(random==0) return getNonZeroRandomNumber();
    return random;
}

第二种情况:使用var random=Math.floor(Math.random()*199) - 99;(标记建议)

1
2
3
4
5
function getNonZeroRandomNumberWithMathFloor(){
    var random = Math.floor(Math.random()*199) - 99;
    if(random==0) return getNonZeroRandomNumber();
    return random;
}

方法论

由于这是一个简短的辩论,我选择了fiddle.net进行比较。

测试包括运行上述函数100.000次,然后检索出99-99的极端数与其他数(比如33-33)的乘积。

然后,测试将给出一个简单的输出,包括99-99的外观百分比以及33-33的外观百分比。

它将用于从Safari 6.0.2到给出这个答案的输出的Webkit实现,但是任何人都可以在fiddle.net上用您最喜欢的浏览器进行测试。

第一个场景的结果:

  • 正常发病率:0.97%
  • 极端发病率:0.52%
  • 极端事件与正常事件的百分比:53.4%//事实上的一半几率

第二种方案的结果:

  • 正常发病率:1.052%
  • 极端发病率:0.974%
  • 极端事件相对于正常事件的百分比:92%//接近标准差最小的公平结果

结果如下:http://jsfiddle.net/brunovieira/lrxqh/


这里有一个通用的解决方案,可以让您设置边界,并选择加入/退出包括0

1
2
3
4
5
6
7
var pos = 99,
    neg = 99,
    includeZero = false,
    result;

do result = Math.ceil(Math.random() * (pos + neg)) - neg;
while (includeZero === false && result === 0);

posneg值包含在内。

这样就不需要对正负范围进行平衡。

或者,如果您担心由于单个排除值而导致的重新运行,您可以将初始范围缩小一个,并将1添加到任何大于或等于0的结果中。

1
2
3
4
5
6
var pos = 5,
    neg = 5,
    result;

result = Math.floor(Math.random() * (pos + neg)) - neg;
result = result < 0 ? result : result + 1;

如果您愿意,最后一行可能会更短:

1
result += (result >= 0)