27

可能重复:
在特定范围内的 Javascript 中生成随机数?

我怎样才能得到一个随机值,例如,从 -99 到 99,不包括 0?

4

3 回答 3

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

var ranNum = Math.ceil(Math.random() * 99) * (Math.round(Math.random()) ? 1 : -1)
于 2012-11-19T13:45:54.603 回答
8

这将返回您想要的

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

这是一个功能小提琴

编辑

为了在用户@MarkDickinson 对我发布的第一个代码做出了真正相关的贡献的评论中发生了一些争论,为未来的读者做出贡献,我决定在使用Math.floor()Math.round()函数之间进行快速比较以返回值操作通缉。

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

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;(标记建议)

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

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

第一种情况的结果:

  • 正常发生率:0.97%
  • 极端事件发生率:0.52%
  • 极端事件相对于正常事件的百分比:53.4% // 确实有一半的机会

第二种情况的结果:

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

结果可以在这里看到:http: //jsfiddle.net/brunovieira/LrXqh/

于 2012-11-19T13:49:10.347 回答
3

这是一个通用解决方案,可让您设置界限,并选择加入/退出包含0.

var pos = 99,
    neg = 99,
    includeZero = false,
    result;

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

posneg值是包容性的。

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


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

var pos = 5,
    neg = 5,
    result;

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

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

result += (result >= 0)
于 2012-11-19T14:03:47.387 回答