Javascript Math.random()帮助获取'+;N';和'-N';随机数(不包括特定范围)
我需要一些关于Math.random()的帮助。: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之间的随机数,然后随
我必须旋转一些图像(使用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