Math.random()帮助获得'+ N'和'-N'randoms(不包括特定范围)

时间:2011-08-16 17:47:04

标签: javascript jquery math random

我需要帮助 Math.random()
我必须旋转一些图像(使用CSS3变换(度))
 从-40+40的方式获得结果 但跳过范围的结果: -20 +20

math random defined + - radius

如果我没有错,这会在 -40 +40

的范围内随机获得结果
  var counter = Math.round(Math.random()*81)-40;

如何从-20和+20之间的结果数字中排除???

9 个答案:

答案 0 :(得分:13)

随机-1或1次0-20随机加20,可以工作

(Math.random()<.5?-1:1)*Math.floor(Math.random()*20 + 21);

1300次运行的样本结果(为简单起见仅显示正面):

Number_21: 70
Number_22: 62
Number_23: 56
Number_24: 57
Number_25: 79
Number_26: 57
Number_27: 64
Number_28: 60
Number_29: 57
Number_30: 67
Number_31: 63
Number_32: 81
Number_33: 81
Number_34: 65
Number_35: 59
Number_36: 59
Number_37: 62
Number_38: 71
Number_39: 52
Number_40: 78

答案 1 :(得分:10)

我会生成20到40之间的随机数,然后随机否定它。

var counter = (Math.round(Math.random() * 20) + 20) * (Math.random() < 0.5 ? 1 : -1);

答案 2 :(得分:9)

修改现有答案以给出均匀分布范围-40到-21和21到40:

(Math.random()<.5?-1:1)*(Math.floor(Math.random()*20) + 21)

答案 3 :(得分:7)

没有分支,只有 random()调用,使用模数运算符的魔力:

//Return a result between -40 and +40, excluding the range -20 to +20
var zeroToThirtyNine = Math.floor(Math.random()*40)
var counter = ((zeroToThirtyNine+61)%81)-40
zeroToThirtyNine | counter
---------------------------
               0 | 21
               1 | 22
               2 | 23
                ...
              18 | 39
              19 | 40
              20 | -40
              21 | -39
                ...
              37 | -23
              38 | -22
              39 | -21

答案 4 :(得分:6)

生成-20到+20之间的数字,如果是负数,则减去另外20度。如果是肯定的,加20度。

另外,你可能想要地板而不是圆形,所以你不会得到41度。

var counter = Math.floor(Math.random()*81)-40;

答案 5 :(得分:4)

您想要生成40个可能的数字(-40到-21,21到40-这些都是20个数字范围) - &gt;在[0,39]中生成随机均匀分布的数字(也包含40个数字)。这可以通过Math.floor(Math.random()* 40)

在Javascript中完成

将输出范围映射到所需的范围。

例如:

var uniformFrom0To39 = Math.floor(Math.random()*40)
return uniformFrom0To39 <= 19 ? uniformFrom0To39 - 40 : uniformFrom0To39 + 1

您还可以使用数组[-40,-39,...,-21,21,22,...,40]执行映射 - 您还可以将该实现解释为“使用数组创建数组您想要的值,并随机选择一个“。

答案 6 :(得分:3)

您的代码在-40和+41之间提供随机数,因为Math.round()可以向上舍入。 以下代码应该给出您想要的内容:

if(Math.random()>0.5) {
    counter = Math.round(Math.random()*19)-40 // from -40 to -21
} else {
    counter = Math.round(Math.random()*19)+21 //from +21 to +40
}

答案 7 :(得分:0)

如果你有一个不太对称的排除区域,你可以像这样进行随机化:

do
{
    random = Math.floor(Math.random()*81 - 40);
}
while ((randomNum < excludedMax) && (randomNum > excludedMin));

如果您想要排除,例如-19到4或其他奇数,这将很有用。它对你的情况也很有用。

答案 8 :(得分:-1)

写一个循环循环,直到你得到一个超出范围的数字。它很容易理解,并且很容易证明你获得的数字仍然是随机的。