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全选反选#jquery

Javascript / jQuery - 隐藏字段时禁用验证

javascript,jquery上的qts [重复]

CodeIgniter 和 Javascript/Jquery 库

JavaScript 快速Javascript / jQuery函数