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对我发布的第一个代码做出的确实相关的贡献中为未来的读者做出贡献,我决定对使用
第一个场景:使用
1 2 3 4 5 | function getNonZeroRandomNumberWithMathRound(){ var random = Math.round(Math.random()*198) - 99; if(random==0) return getNonZeroRandomNumber(); return random; } |
第二种情况:使用
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次,然后检索出
然后,测试将给出一个简单的输出,包括
它将用于从
第一个场景的结果:
- 正常发病率:0.97%
- 极端发病率:0.52%
- 极端事件与正常事件的百分比:53.4%//事实上的一半几率
第二种方案的结果:
- 正常发病率:1.052%
- 极端发病率:0.974%
- 极端事件相对于正常事件的百分比:92%//接近标准差最小的公平结果
结果如下:http://jsfiddle.net/brunovieira/lrxqh/
这里有一个通用的解决方案,可以让您设置边界,并选择加入/退出包括
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); |
这样就不需要对正负范围进行平衡。
或者,如果您担心由于单个排除值而导致的重新运行,您可以将初始范围缩小一个,并将
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) |