Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Math.random()帮助获取'+;N';和'-N';随机数(不包括特定范围)_Javascript_Jquery_Math_Random - Fatal编程技术网

Javascript Math.random()帮助获取'+;N';和'-N';随机数(不包括特定范围)

Javascript Math.random()帮助获取'+;N';和'-N';随机数(不包括特定范围),javascript,jquery,math,random,Javascript,Jquery,Math,Random,我需要一些关于Math.random()的帮助。: 我必须旋转一些图像(使用CSS3变换(deg)) 从-40到+40 但跳过范围为:-20和+20的结果 var counter = Math.round(Math.random()*81)-40; 如果我没有错,这将使我得到范围从-40到+40的随机结果 var counter = Math.round(Math.random()*81)-40; 如何从结果中排除-20和+20之间的数字 我会生成一个20到40之间的随机数,然后随

我需要一些关于Math.random()的帮助。
我必须旋转一些图像(使用CSS3变换(deg))
-40
+40

但跳过范围为:-20和+20的结果

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

如果我没有错,这将使我得到范围从-40+40的随机结果

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

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

我会生成一个20到40之间的随机数,然后随机取反

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

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

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

生成-20到+20之间的数字,如果为负数,再减去20度。如果为正,则加20度

另外,你可能想要地板而不是圆形,这样你就不会得到41度

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

您的代码给出的是介于-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
}

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

如果你的排除区域不太对称,你可以这样做:

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

如果你想排除,比如说,-19到4或者其他一些奇怪的东西,这将非常有效。这对您的情况也很有用。

修改现有答案,以给出一个统一的分布范围-40到-21和21到40:

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

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

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

例如:

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

使用模运算符的魔力,将UNIFORMFROM0返回到39,不带分支,只返回一个单个
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
零至三九|计数器 --------------------------- 0 | 21 1 | 22 2 | 23 ... 18 | 39 19 | 40 20 | -40 21 | -39 ... 37 | -23 38 | -22 39 | -21
感谢您的示例!;)+1如果使用
Math.round(Math.random()*x)
,您将获得的最高值是
x
。谢谢Xeon06!我想我明白了额外的“1”的意思了。。。只是干扰计数…如果排除区域大于可接受数字的区域,这种方法可能会非常缓慢。当然。它非常简单、可读,并且易于修改值,并且仍然可以理解。但绝对不是优化的。等等!到底是怎么回事?这很有趣!谢谢你的时间伪码:当随机数在-20和20之间时,再随机一次。效率低,缺点是过于复杂。不过我喜欢简单易懂的。Math.random()返回一个介于0和1之间(含0和1)的浮点数。因此,如果Math.random()小于0.5,则返回负1,否则返回1。基本上,它允许大约一半的代码运行将乘以一个负的。不是真的,不。如果你想要整数的可读性,那么你可以使用Math.round,但它不是必需的。这个解决方案与Xeon06的问题相同-40、-20、20和40的给定频率是其他整数的一半。所以这不是一个统一的分布。事实上,很抱歉我测试的延迟。问题并没有说,但当给出一个“随机”答案时,我认为应该期望一个均匀分布,除非另有说明。这个解得到-40、-20、20和40的频率是这个范围内其他整数的一半。哦,这很有趣。我对概率很差劲+我希望你的回答也是非均匀分布-40、-21、21和40的出现频率是其他人的一半。所以,只要写一份简历:如果状态
*21
那么结果是?40-21,对吧-40到-20和20到40:(Math.random()对,我不需要+|-20,只要从21到40!很棒的工作用户12861!+1有趣的是,有多少种方法可以解决同一个问题!很好的答案!很酷的主意-应该也是这里最快的解决方案,因为它避免了任何处理器管道flushes@Heinzi:对
Math.Random()的第二次调用
将比管道冲洗慢几个数量级。。。 zeroToThirtyNine | counter --------------------------- 0 | 21 1 | 22 2 | 23 ... 18 | 39 19 | 40 20 | -40 21 | -39 ... 37 | -23 38 | -22 39 | -21