Javascript 正负值之间的随机数

Javascript 正负值之间的随机数,javascript,random,numbers,Javascript,Random,Numbers,可能重复: 如何获得介于-99和99之间(不包括0)的随机值 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和99之间(不包括0)的随机值

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)

这将返回您想要的内容

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(我的第一个建议)

第二个场景:使用
var random=Math.floor(Math.random()*199)-99(标记建议)

方法学

由于这是一场简短的辩论,我选择做比较

测试包括运行上述函数100.000次,然后检索极端数
99
-99
相对于其他数字出现的次数,比如
33
-33

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

它将在Safari 6.0.2的Webkit实现中使用,以给出此答案的输出,但任何人都可以稍后使用您喜爱的浏览器进行测试

第一个场景的结果:

  • 正常眼率:0.97%
  • 极端眼疾的百分比:0.52%
  • 极端眼症相对于正常眼症的百分比:53.4%/确实有一半的几率
第二种情况的结果:

  • 正常眼率:1.052%
  • 极端眼疾的百分比:0.974%
  • 极端眼压相对于正常眼压的百分比:92%//接近标准偏差最小的公平结果

结果可以在这里看到:

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

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

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

result = Math.floor(Math.random() * (pos + neg)) - neg;
result = result < 0 ? result : result + 1;
pos
neg
值都包含在内

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


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

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

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

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

获取一个典型范围,减去负数,看看数字是否为
0
。如果为零,请再次调用该函数…投票关闭的人似乎没有费心使用“排除”这个词。我想你想要
199
而不是
188
。我想我想要198!只是打字错误!不,如果您希望同时包含
-99
99
作为可能,则需要
199
。如果你使用
198
,那么
99
是不可能出现的(至少,没有任何合理的可能性)。我在回答中的意思是198,但你是对的,它永远不会返回99。因此,我将从
Math.floor
更改为
Math.round()
,这将解决问题。谢谢你顺便通知我!但是对于
Math.round
-99
99
的出现概率是其他值的一半!(如果你不相信我,就测试一下:-)你真的想要
199
Math.floor
<代码>位置=1负=1
。你能预测它会浪费多少个循环吗?现在想象一下“差距”比“正确结果”更大。@OlegV.Volkov:通常情况下,这不是每个问题的正确解决方案。但它很容易调整为一个狭窄的范围。当然,对于
-1
1
范围(不包括
0
),我们只需执行
Math.random()<.5:-1:1所以你需要知道你传递的数字是正数还是负数,而不仅仅是任何范围?(neg-neg或pos-pos)我不熟悉javascript。这里的num*是什么。我的意思是这个概念叫什么,这样我就可以了解它了@LittleSweetSeas@DeepikaRao这是一个简单的乘法,在一个随机数(从0到0.999…)和目标数(在我们的示例中是99)之间,第二个数字应该是“==”而不是“==”line@YikSanChan我可能同意,但由于这些类型是众所周知的(都是整数),因此没有真正的优势,也没有性能提升。我错了吗?:)
result += (result >= 0)