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

IT技术 javascript random
2021-01-28 04:11:21

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

6个回答

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

const rndInt = randomIntFromInterval(1, 6)
console.log(rndInt)

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

这也很棒,因为如果有人不包含toarg,则fromarg 将作为最大值的两倍
2021-03-13 04:11:21
请注意,此解决方案仅当 min 和 max 为整数时才是正确的,否则您可以在区间 [min, ceil(max)] 中得到结果。即您可以得到超出范围的结果,因为它高于最大值。
2021-03-16 04:11:21
阅读上面的评论。随机在 [0,1) 内,而不是 [0,1]。
2021-04-01 04:11:21
如果较低的数字为 0,则效果很好。
2021-04-03 04:11:21
你好。这是从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/...
2021-04-05 04:11:21

重要的

以下代码仅在最小值为“1”时才有效。它不适用于除“1”以外的最小值。

如果你想得到一个介于 1(并且只有 1)和 6之间的随机整数,你可以计算:

    const rndInt = Math.floor(Math.random() * 6) + 1
    console.log(rndInt)

在哪里:

  • 1 是起始编号
  • 6 是可能的结果数 (1 + start (6) - end (1) )
虽然这会起作用,@Mike,但最好指出更通用的版本,因为 Francisc 在下面有它:-)。
2021-03-10 04:11:21
这仅在最小值为 1 时有效。如果最小值为 2 并且我们仍然使用Math.floor(Math.random() * 6) + 2意味着如果Math.random()结果为 0.99,我们的随机值将是7
2021-03-12 04:11:21
这段代码不好,因为不适用于任何数字。@Francisc 代码是正确的。
2021-03-17 04:11:21
-1. 谷歌搜索后,我发现这个问题的标题是“在Javascript中生成两个数字之间的随机值”。如果最小值为 0 则不起作用
2021-03-23 04:11:21
如果您想要两个较大数字之间的数字,则不起作用,例如。Math.floor(Math.random() * 900) + 700
2021-04-04 04:11:21

Math.random()

返回一个介于 min(包括)和 max(包括之间整数随机数

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

min(包括)和 max(不包括之间的任何随机数

function randomNumber(min, max) {
  return Math.random() * (max - min) + 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;

** 总是很高兴被提醒(Mozilla):

Math.random() 不提供加密安全的随机数。不要将它们用于与安全相关的任何事情。改用 Web Crypto API,更准确地说是 window.crypto.getRandomValues() 方法。

@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。
2021-03-15 04:11:21
让我感到困惑的东西...... Math.floor(..) 确保数字是一个整数,其中 Math.round(..) 会给出不均匀的分布。参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-16 04:11:21
@shuji 这正确的答案。我只是想澄清为什么使用Math.roundoverMath.floor会产生不同的结果。
2021-03-19 04:11:21
我找到的最准确的解决方案: function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
2021-03-21 04:11:21
我相信这个答案。任何人都可以提供链接或明确解释为什么会这样吗?也许是 Math.round 如何给出偏差的一个例子,为什么这意味着我们必须使用这个看起来相当复杂的公式?
2021-04-01 04:11:21

其他解决方案:

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

在线试用

你介意解释(或参考)~~ sintaxis 吗?我以前没见过!优雅的解决方案,但难以理解。
2021-03-15 04:11:21
注意:如果您正在处理一些非常大的数字,则双波浪号将不起作用。尝试~~(Math.random() * (50000000000000 - 0 + 1)) + 0Math.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
2021-03-17 04:11:21
@edi9999 写得更快,但执行得也更快?
2021-03-22 04:11:21
双波浪号 ~~a按位 OR (a | 0) 是编写 Math.floor(a) 的更快方法
2021-03-23 04:11:21
a | 0也是将字符串转换为整数的最快和最优化的方法。它只适用于包含整数("444""-444")的字符串,即没有浮点数/分数。0为所有失败的东西产生 a 它是 asm.js 背后的主要优化之一。
2021-03-26 04:11:21

TL; 博士

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

获取随机数 generateRandomInteger(-20, 20);

解释如下

我们需要得到一个随机整数,比如最小值和最大值之间的X。

对?

最小值 <= X <= 最大值

如果我们从等式中减去 min,这等价于

0 <= (X - min) <= (max - min)

现在,让我们将其乘以一个随机数r ,即

0 <= (X - min) * r <= (max - min) * r

现在,让我们在等式中重新添加min

min <= min + (X - min) * r <= min + (max - min) * r

现在,让我们选择一个导致r的函数,使其满足我们的方程范围 [min,max]。这仅在0<= r <=1 时才有可能

好的。现在,r的范围即 [0,1] 与 Math.random() 函数结果非常相似。不是吗?

Math.random() 函数返回 [0, 1) 范围内的浮点伪随机数;即,从 0(含)到但不包括 1(不含)

例如,

案例 r = 0

min+ 0 * ( max- min) =分钟

案例 r = 1

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

使用 Math.random 0 <= r < 1 的随机案例

min+ r * ( max- min) = X,其中X 的范围为min <= X < max

上面的结果X是一个随机数字。然而,由于 Math.random() 我们的左边界是包含的,而右边界是不包括的。为了包括我们的右边界,我们将右边界增加 1 并对结果进行取底。

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

获取随机数

generateRandomInteger(-20, 20);