javascript/jquery 介于 -13 和 13 之间的随机数,不包括 -3 和 3 之间的数字
Posted
技术标签:
【中文标题】javascript/jquery 介于 -13 和 13 之间的随机数,不包括 -3 和 3 之间的数字【英文标题】:javascript/jquery random number between -13 and 13 excluding numbers between -3 and 3 【发布时间】:2012-03-07 20:46:51 【问题描述】:我正在使用
var min = -13;
var max = 13;
var random = Math.floor(Math.random() * (max - min + 1)) + min;
但它返回 -13 到 13 之间的所有数字(随机数)。我怎样才能让它生成一个介于 -13 到 -4 之间的随机数,不包括 -3、-2、-1、0、1、2、3包括4到13。
【问题讨论】:
我认为这是不可能的。我会用你想要的值创建一个数组并随机访问数组 @EvilP,这会将恒定时间和空间操作转换为线性时间和空间操作。这就像一个数字加 1 一百次加 100。它有效,但至少可以说是不可取的。 @davin 数组访问线性时间操作如何 @Esailija,我没有说它是,虽然创建数组是线性时间。事实上,从技术上讲,它是指数空间和时间,因为输入的值是对数。 @davin 操作本身不涉及创建数组,数组是预先创建的, 【参考方案1】:取一个1-10之间的随机数,加3,得到4-13之间的一个:
random = Math.ceil(Math.random() * 10) + 3;
在 0-1 之间生成一个随机数。如果为0,则取负数:
random = (Math.floor(Math.random() * 2) == 0) ? 0 - random : random;
JSFiddle 显示工作副本:
http://jsfiddle.net/adamh/cyGwf/
【讨论】:
标志可以通过random = (Math.random() < 0.5)? -random : random;
轻松生成,无需调用math.floor
风险非常小,但知道 Math.random() 提供值from 0 (including!) to 1 (excluding!),第一行可以提供值 3。因此,使用 Math.floor 和从那里工作:random = Math.floor(Math.random() * 10) + 4;
【参考方案2】:
var pickOne = [4,5,6,7,8,9,10,11,12,13],
value = pickOne[Math.floor(Math.random() * pickOne.length)];
value = (Math.random() < 0.5)? value : -value;
console.log(value)
【讨论】:
【参考方案3】:对你应该做的事情进行细微的调整。产生一个 -6 到 13 范围内的随机数,然后如果值小于 4,则减去 7。我没有测试过,但我怀疑它会比产生两个随机数并相乘更好。
var min = -6;
var max = 13;
var random = Math.floor(Math.random() * (max - min + 1)) + min;
if(random < 4)random = random - 7;
【讨论】:
【参考方案4】:据我所知,不可能生成随机数并考虑排除集。您需要创建一个递归函数来为您进行过滤。见下文:
function GenerateRandomNumber()
var min = -13, max = 13;
var random = Math.floor(Math.random() * (max - min + 1)) + min;
// If random number is undesirable, generate a new number, else return
return (random < 4 && random > -4) ? GenerateRandomNumber() : random;
var myRandomNumber = GenerateRandomNumber();
这里是a working fiddle。
或者,由 @Rozwel 提供,使用 while 循环的非递归版本:
function GenerateRandomNumber()
var min = -13, max = 13;
var random = 0;
while (random < 4 && random > -4)
random = Math.floor(Math.random() * (max - min + 1)) + min;
return random;
这里是a jsperf,它将接受的答案与这两个选项进行比较。
【讨论】:
理论上可以进入无限循环 @FabrizioCalderan,你是认真的吗? -1 表示理论上(尽管在数学上不可能)的可能性? @JamesHill,代码会以零概率进入循环,并且有一个线性的预期运行时间,所以理论上这段代码还不错。您是否对自己的帖子投了反对票? @JamesHill -1 因为没有什么可以阻止函数在输出有效值之前多次生成 -2、1、2、-3...。在大学里,我看到有些人因为这种逻辑而被拒绝。实际上,您不会有无限循环,但由于上述原因,这仍然是低效的 不确定它会如何影响结果,但是这些测试用例非常没用;有时你在函数中有代码,有时没有,有时你使用硬编码的幻数,有时你使用变量。所有这些差异都会改变查找时间等。因此,数据并不是很有用。【参考方案5】:var sign = Math.round(Math.random()) == 0 ? -1 : 1;
var number = Math.round(Math.random() * 9) + 4;
return sign * number;
【讨论】:
【参考方案6】:Math.round(Math.random()) 返回 0 或 1,
所以它可以写成没有中间值:
alert( (Math.ceil(Math.random() * 10) + 3)*(Math.round(Math.random())?1:-1));
【讨论】:
【参考方案7】:var n = Math.floor(Math.random() * 20) - 10;
n = n < 0 ? n - 3 : n + 4;
【讨论】:
以上是关于javascript/jquery 介于 -13 和 13 之间的随机数,不包括 -3 和 3 之间的数字的主要内容,如果未能解决你的问题,请参考以下文章
javascript 使用JQuery #javascript #jquery将“a”tages滚动到div ID
Javascript / jQuery - 隐藏字段时禁用验证