题 在JavaScript中生成两个数字之间的随机数


有没有办法在JavaScript中生成指定范围内的随机数(例如1到6:1,2,3,4,5或6)?


1244
2018-02-10 16:41


起源


Math.floor(Math.random()* 7) - Amjad Masad
当然.. Math.floor(Math.random()* 6 + 1) - Amjad Masad
Nabil Kadimi写了一篇文章 如何生成负的随机数 太。 - madc
这是一个有用的要点: gist.github.com/kerimdzhanov/7529623 - Dan K.K.
可能重复 在Javascript中生成特定范围内的随机数?


答案:


如果你想得到1到6之间,你会计算:

Math.floor(Math.random() * 6) + 1  

哪里:

  • 1是起始编号
  • 6是可能的结果数(1 +开始 (6) - 结束 (1)

1544
2018-02-10 16:45



虽然这可行,但@Mike,最好指出更为通用的版本,因为Francisc有以下内容:-)。 - Raymond Machira
-1。谷歌搜索后我发现这个问题的标题是“”在Javascript中生成两个数字之间的随机值“。”如果最小值为0,则无效 - Ydhem
如果您想要两个较大数字之间的数字,则不起作用,例如。 Math.floor(Math.random()* 900)+ 700 - Rob
只有在最小值为1时才有效。如果min为2,我们仍然使用 Math.floor(Math.random() * 6) + 2 意味着如果 Math.random() 结果为0.99我们的随机值将是 7 - antitoxic
此代码不好,因为,不适用于任何数字。 @Francisc代码是正确的。 - Lion King


function randomIntFromInterval(min,max)
{
    return Math.floor(Math.random()*(max-min+1)+min);
}

它所做的“额外”是它允许以1开头的随机间隔。 因此,您可以获得10到15之间的随机数。灵活性。


1664
2017-08-29 09:25



这也很棒,因为如果有人不包括 to arg,the from arg最多翻倍 - Jason
谢谢你的回答。代码使逻辑易于理解。 - brack
你好。这是来自MDN: Returns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range. (developer.mozilla.org/en-US/docs/JavaScript/Reference/...) - Francisc
阅读以上评论。随机在[0,1]内,而不是[0,1]。 - Francisc
请注意,只有当min和max为整数时,此解决方案才是正确的,否则您可以在[min,ceil(max)]区间内得到结果。即你可以得到一个超出范围的结果,因为它高于最大值。 - collimarco


的Math.random()

来自 Mozilla的 开发者网络文档:

// Returns a random integer between min (include) and max (include)

Math.floor(Math.random() * (max - min + 1)) + min;

有用的例子:

// 0 -> 10
Math.floor(Math.random() * 11);

// 1 -> 10
Math.floor(Math.random() * 10) + 1;

// 5 -> 20
Math.floor(Math.random() * 16) + 5;

// -10 -> (-2)
Math.floor(Math.random() * 9) - 10;

189
2018-06-11 00:23



让我困惑的东西...... Math.floor(..)确保数字是一个整数,其中Math.round(..)会给出不均匀的分布。参考: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - alikuli
我相信这个答案。任何人都可以提供链接或清楚解释为什么这有效吗?也许是Math.round如何产生偏见的一个例子,为什么这意味着我们必须使用这个相当复杂的公式呢? - Robin
@alikuli对于一系列的 [1,2],有25%的几率 Math.random() 会给你一个来自其中一个的数字 [0,0.49], [0.5,0.99], [1,1.49], [1.5,1.99]。舍入这些间隔将导致0,1,1,2,这不是均匀分布。将它们放置为0,0,1,1。 - destoryer
@shuji这个 是其中包括正确的答案。我只想澄清为什么使用 Math.round 过度 Math.floor 会给出不同的结果。 - destoryer


其他方案:

  • (Math.random() * 6 | 0) + 1
  • ~~(Math.random() * 6) + 1

76
2017-11-09 10:08



你会介意解释(或提供参考)~~ sintaxis吗?我以前没见过!优雅的解决方案,但很难理解。 - DiegoDD
双Tilde  ~~a 和 按位OR (a | 0)是编写Math.floor(a)的更快方法 - edi9999
a | 0 也是将字符串转换为整数的最快和最优化的方法。它只适用于包含整数的字符串("444" 和 "-444"),即没有漂浮物/馏分。它会产生一个 0 因为一切都失败了。这是asm.js背后的主要优化之一。 - pilau
@ edi9999编写速度更快,但执行速度更快? - csguimaraes
注意:如果你正在处理一些非常大的数字,那么双波浪线将不起作用。尝试 ~~(Math.random() * (50000000000000 - 0 + 1)) + 0 和 Math.floor(Math.random() * (50000000000000 - 0 + 1)) + 0 - BrunoLM


Math.random()函数返回一个浮点伪随机函数   数字在[0,1]范围内;也就是说,从0(含)到最高但不是   包括1(独家)

让我们 add 该 min  randomly 从 0 至 max-min

案例0

min + 0 *(max - min)=

情况1

min + 1 *(max - min)= 最大

使用Math.random 0 <= r <1的随机情况

min + r *(max - min)= X,哪里 X 有范围的  <= X < 最大

以上结果 X 是一个随机数字。但是由于Math.random(),我们的左边界是包容性的,右边界是独占的。要包含我们的右边界,我们将右边界增加1并将结果置于底层。

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max+1 - min))
}

获取随机数

generateRandomInteger(-20, 20);


28
2018-04-03 11:45





var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;

15
2018-02-10 16:46



确实。我忘了兰特是0包容性的。修复。 - ryebr3ad
那是Pseudocode的一部分...有人可能认为它是真实的,并试图像那样使用它。 - gravityboy
@gravityboy你在说什么?如果有人不能用数字代替[选择数字......],他们可能不适合作为程序员。 - ryebr3ad
@ ryebr3ad -1!它在javascript中说不是伪代码,也不是所有的读者都是有成就的程序员。很多都是初学者! - Steve
@ ryebr3ad:我有一位同事正在向实习生讲授他们需要支持的数据库环境。他告诉他们从表中选择所有内容,然后他们就开始在SQL查询编辑器中编写“从...中选择所有内容”。你做了同样的反应。 - Ellesedil


或者,在 下划线

_.random(min, max)

14
2017-10-03 01:52



并且lodash: lodash.com/docs#random - mg1075


的jsfiddle: https://jsfiddle.net/cyGwf/477/

随机整数:获取之间的随机整数 min 和 max,使用以下代码

function getRandomInteger(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min;
}

随机浮点数:获取之间的随机浮点数 min 和 max,使用以下代码

function getRandomFloat(min, max) {
  return Math.random() * (max - min) + min;
}

参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random


14
2018-01-25 04:33





数学不是我的强项,但我一直致力于一个项目,我需要在正面和负面之间产生大量的随机数。

function randomBetween(min, max) {
    if (min < 0) {
        return min + Math.random() * (Math.abs(min)+max);
    }else {
        return min + Math.random() * max;
    }
}

例如

randomBetween(-10,15)//or..
randomBetween(10,20)//or...
randomBetween(-200,-100)

当然,您还可以添加一些验证,以确保不使用除数字之外的任何其他内容。还要确保min始终小于或等于max。


11
2018-03-20 21:23



这是完全错误的。 min + Math.random() * max 会给你min和min + max之间的数字,这不是你想要的。第一个分支 if 是正确的,但可以简化说 return min + Math.random() * (max - min),无论min是正还是负,这都是正确的解决方案(参见其他答案)。此外,请记住,如果您不想要分数,您仍需要对结果进行平台处理。 - Avish
他说数学不是他的强项! ;) - Enrico


我写了更灵活的函数,可以给你随机数,但不仅仅是整数。

function rand(min,max,interval)
{
    if (typeof(interval)==='undefined') interval = 1;
    var r = Math.floor(Math.random()*(max-min+interval)/interval);
    return r*interval+min;
}

var a = rand(0,10); //can be 0, 1, 2 (...) 9, 10
var b = rand(4,6,0.1); //can be 4.0, 4.1, 4.2 (...) 5.9, 6.0

修正版。


6
2018-05-10 20:14



这不是一个好的解决方案,因为它不能用零作为最小值。请参阅@ Lior的回答。 - Sebastien
当然,它的最小值为零。你试过了吗?它没有理由不起作用。它不能用0作为不奇怪的间隔(间隔= 0?...)。 - ElChupacabra
我运行了多次这个函数,零作为最小值,从未在输出中获得零。或者我不够幸运...... - Sebastien
你是对的。 “+ interval”在错误的地方。请现在测试一下。奇怪的是,有时候console.log给了我0.300000004而不是0.3像3 * 0.1就不会精确到0.3。 - ElChupacabra