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

Mir*_*rod 1635 javascript random

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

Fra*_*isc 2093

function randomIntFromInterval(min, max) { // min and max included 
  return Math.floor(Math.random() * (max - min + 1) + min);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 你好.这是来自MDN:`返回[0,1]范围内的浮点伪随机数,从0(含)到0但不包括1(不包括),然后可以缩放到所需的范围.(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/random) (9认同)
  • 这也很棒,因为如果有人不包含`to` arg,那么`from` arg会加倍 (5认同)
  • 阅读以上评论.随机在[0,1]内,而不是[0,1]. (5认同)
  • 如果较低的数字为0,则效果很好. (3认同)
  • 请注意,只有当min和max为整数时,此解决方案才是正确的,否则您可以在[min,ceil(max)]区间内得到结果.即你可以得到一个超出范围的结果,因为它高于最大值. (2认同)

khr*_*055 1971

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

Math.floor(Math.random() * 6) + 1  
Run Code Online (Sandbox Code Playgroud)

哪里:

  • 1是起始编号
  • 6是可能结果的数量(1 + start (6) - end (1))

  • -1.谷歌搜索后,我发现这个问题的标题是""在Javascript中生成两个数字之间的随机值"." 如果最小值为0,则无效 (54认同)
  • 虽然这样可行,但@Mike,最好指出更为通用的版本,因为Francisc有以下内容:-). (39认同)
  • 此代码不好,因为,不适用于任何数字.@Francisc代码是正确的. (24认同)
  • 如果你想要两个较大数字之间的数字,则不起作用,例如.Math.floor(Math.random()*900)+ 700 (17认同)
  • 只有当最小值为1时才有效.如果min是2并且我们仍然使用`Math.floor(Math.random()*6)+ 2`意味着如果`Math.random()`导致0.99我们的随机值将是'7` (13认同)
  • 正确的方法是`Math.floor(Math.random()*(max-min))+ min`所以在这种情况下它将是`Math.floor(Math.random()*5)+ 1 (7认同)

Lio*_*rom 265

的Math.random()

Mozilla Developer Network文档中:

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

Math.floor(Math.random() * (max - min + 1)) + min;
Run Code Online (Sandbox Code Playgroud)

有用的例子:

// 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;
Run Code Online (Sandbox Code Playgroud)

  • @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. (6认同)
  • 我相信这个答案。任何人都可以给出链接或清楚解释为什么它有效吗?也许有一个例子可以说明 Math.round 如何产生偏差,以及为什么这意味着我们必须使用这个看似相当复杂的公式? (2认同)

Vis*_*hal 84

其他方案:

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

  • [Double Tilde](http://stackoverflow.com/questions/5971645/what-is-the-double-tilde-operator-in-javascript)`~~ a`和[Bitwise OR](http:// stackoverflow. com/questions/7487977/using-bitwise-or-0-to-floor-a-number)(a | 0)是编写Math.floor(a)的更快方法 (25认同)
  • 你会介意解释(或提供参考)~~ sintaxis吗?我以前没见过!优雅的解决方案,但很难理解. (6认同)
  • `a | 0`也是将字符串转换为整数的最快和最优化的方法.它只适用于包含整数的字符串("444"和"-444"),即没有浮点数/分数.对于失败的一切,它会产生一个"0".它是asm.js背后的主要优化之一. (6认同)
  • 注意:如果使用的是非常大的数字,则双波浪号将不起作用。尝试`~~(Math.random()*(50000000000000-0 + 1))+ 0`和`Math.floor(Math.random()*(50000000000000-0 + 1))+ 0` (3认同)
  • @edi9999 编写速度更快,但执行速度也更快? (2认同)
  • “双波浪号和按位OR /是编写Math dot floor的更快方法”是一副美丽的押韵对联,使我的早晨更加光彩。感谢@ edi9999! (2认同)

Fai*_*eef 54

TL; DR

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max + 1 - min))
}
Run Code Online (Sandbox Code Playgroud)

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

下面的说明

我们需要得到一个随机整数,比如说min和max之间的X.

对?

min <= X <= max

如果我们从等式中减去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 ie [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))
}
Run Code Online (Sandbox Code Playgroud)

获取随机数

generateRandomInteger(-20, 20);


Gas*_*ass 23

获取0400之间的随机整数

let rand = Math.round(Math.random() * 400)

document.write(rand)
Run Code Online (Sandbox Code Playgroud)

获取2001500之间的随机整数

let range = {min: 200, max: 1500}
let delta = range.max - range.min

const rand = Math.round(range.min + Math.random() * delta)

document.write(rand)
Run Code Online (Sandbox Code Playgroud)

使用函数

function randBetween(min, max){
  let delta = max - min
  return Math.round(min + Math.random() * delta)
}

document.write(randBetween(10, 15));
Run Code Online (Sandbox Code Playgroud)

// JavaScript ES6 arrow function

const randBetween = (min, max) => {
  let delta = max - min
  return Math.round(min + Math.random() * delta)
}

document.write(randBetween(10, 20))
Run Code Online (Sandbox Code Playgroud)


rye*_*3ad 20

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

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

Raz*_*aul 20

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

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

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

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

function getRandomFloat(min, max) {
  return Math.random() * (max - min) + min;
}
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*sen 12

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

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

例如

randomBetween(-10,15)//or..
randomBetween(10,20)//or...
randomBetween(-200,-100)
Run Code Online (Sandbox Code Playgroud)

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

  • 这是完全错误的.`min + Math.random()*max`会给你min和min + max之间的数字,这不是你想要的.`if`的第一个分支是正确的,但可以简化为`return min + Math.random()*(max - min)`,这是正确的解决方案,无论min是正还是负(参见其他答案).另外,请记住,如果您不想要分数,您仍需要对结果进行分层. (4认同)

Nin*_*pac 12

ES6 / Arrow 函数版本基于 Francis 的代码(即最佳答案):

const randomIntFromInterval = (min, max) => Math.floor(Math.random() * (max - min + 1) + min);
Run Code Online (Sandbox Code Playgroud)


Erd*_*zgi 9

我正在搜索用 TypeScript 编写的随机数生成器,在阅读了所有答案后我写了这篇文章,希望它适用于 TypeScript 编码人员。

    Rand(min: number, max: number): number {
        return (Math.random() * (max - min + 1) | 0) + min;
    }   
Run Code Online (Sandbox Code Playgroud)


Kam*_*ski 9

加密强

[a,b] 范围内的加密强随机整数(假设: a < b )

let rand= (a,b)=> a+(b-a+1)*crypto.getRandomValues(new Uint32Array(1))[0]/2**32|0

console.log( rand(1,6) );
Run Code Online (Sandbox Code Playgroud)

  • @Hexodus 据我所知,JS 没有“32 位整数”(在控制台中输入 2**32 - 并且 js 将显示正确的 int 值) - 更多[此处](/sf/answers/21504031/ )。我们还有 Uint32array - 这意味着无符号整数 32 位数组) (2认同)

ElC*_*bra 8

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

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
Run Code Online (Sandbox Code Playgroud)

固定版本.


Mik*_*ian 8

这支持负整数:

Math.floor(Math.random() * (max - min + 1)) + min;
Run Code Online (Sandbox Code Playgroud)


小智 7

Math.random() 快速且适用于多种用途,但如果您需要加密安全的值(它不安全),或者如果您需要来自完全一致的无偏分布的整数(其他答案中使用的乘法方法会稍微更频繁地产生某些值),则它不合适相对于其它的)。

在这种情况下,我们可以使用crypto.getRandomValues()生成安全整数,并拒绝任何我们无法统一映射到目标范围的生成值。这会更慢,但除非您生成大量值,否则它不会很重要。

为了澄清偏差分布问题,请考虑以下情况:我们想要生成 1 到 5 之间的值,但我们有一个随机数生成器,可以生成 1 到 16 之间的值(4 位值)。我们希望有相同数量的生成值映射到每个输出值,但是 16 不能被 5 整除:它留下 1 的余数。所以我们需要拒绝可能生成的值中的 1 个,并且只有在我们得到时才继续可以统一映射到我们的目标范围的 15 个较小的值之一。我们的行为可能看起来像这个伪代码:

Generate a 4-bit integer in the range 1-16.
If we generated  1,  6, or 11 then output 1.
If we generated  2,  7, or 12 then output 2.
If we generated  3,  8, or 13 then output 3.
If we generated  4,  9, or 14 then output 4.
If we generated  5, 10, or 15 then output 5.
If we generated 16 then reject it and try again.
Run Code Online (Sandbox Code Playgroud)

下面的代码使用类似的逻辑,但生成一个 32 位整数,因为这是 JavaScript 标准number类型可以表示的最大常见整数大小。(BigInt如果您需要更大的范围,可以修改为使用s。)无论选择的范围如何,被拒绝的生成值的比例将始终小于 0.5,因此预期的拒绝次数将始终小于 1.0 并且通常接近0.0;你不需要担心它永远循环。

const randomInteger = (min, max) => {
  const range = max - min;
  const maxGeneratedValue = 0xFFFFFFFF;
  const possibleResultValues = range + 1;
  const possibleGeneratedValues = maxGeneratedValue + 1;
  const remainder = possibleGeneratedValues % possibleResultValues;
  const maxUnbiased = maxGeneratedValue - remainder;

  if (!Number.isInteger(min) || !Number.isInteger(max) ||
       max > Number.MAX_SAFE_INTEGER || min < Number.MIN_SAFE_INTEGER) {
    throw new Error('Arguments must be safe integers.');
  } else if (range > maxGeneratedValue) {
    throw new Error(`Range of ${range} (from ${min} to ${max}) > ${maxGeneratedValue}.`);
  } else if (max < min) {
    throw new Error(`max (${max}) must be >= min (${min}).`);
  } else if (min === max) {
    return min;
  } 

  let generated;
  do {
    generated = crypto.getRandomValues(new Uint32Array(1))[0];
  } while (generated > maxUnbiased);

  return min + (generated % possibleResultValues);
};

console.log(randomInteger(-8, 8));          // -2
console.log(randomInteger(0, 0));           // 0
console.log(randomInteger(0, 0xFFFFFFFF));  // 944450079
console.log(randomInteger(-1, 0xFFFFFFFF));
// Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295.
console.log(new Array(12).fill().map(n => randomInteger(8, 12)));
// [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9]
Run Code Online (Sandbox Code Playgroud)

  • @2xSamurai 在那里,我更新了答案以解释您可能需要它的原因以及它是如何工作的。那个更好吗?:P (2认同)
  • 如果您想要加密安全且均匀分布的随机数,那么这根本不是矫枉过正。生成满足这些要求的随机数很困难。很好的答案,@JeremyBanks。 (2认同)

小智 7

评分最高的解决方案在数学上并不像它下面的评论那样正确 -> Math.floor(Math.random() * 6) + 1

任务: 生成 1 到 6 之间的随机数。

Math.random()返回 0 和 1 之间的浮点数(例如 0.344717274374 或 0.99341293123),我们将其用作百分比,因此Math.floor(Math.random() * 6) + 1返回6 的某个百分比(最大值:5,最小值:0)并添加1作者很幸运,下限是 1.,因为百分比下限将“最大”返回小于 6 乘 1 的 5,而 1 将被下限 1 添加。

当下限大于 1 时会出现问题。例如, Task: generate random between 2 and 6

(按照作者的逻辑) Math.floor(Math.random() * 6) + 2,很明显,如果我们在这里得到 5 ->Math.random() * 6然后加上 2,结果将是 7,超出了所需的 6 边界。

另一个例子, 任务: 在 10 和 12 之间生成随机数

(遵循作者的逻辑) Math.floor(Math.random() * 12) + 10,(抱歉重复)很明显,我们得到了数字"12" 的0%-99% ,这将远远超出所需的 12 边界。

所以,正确的逻辑是取下限上限之间的差加1,然后才将其取舍(减去 1,因为Math.random()返回 0 - 0.99,所以无法获得完整的上限,这就是为什么我们将 1 添加到上限以获得最多 99% 的(上限 + 1),然后我们将其降低以去除多余的部分)。一旦我们得到了 (difference + 1) 的下限百分比,我们就可以添加下边界以获得 2 个数字之间所需的随机数。

其逻辑公式为:Math.floor(Math.random() * ((up_boundary - low_boundary) + 1)) + 10

Ps:即使在评分最高的答案下的评论也是不正确的,因为人们忘记在差异上加1,这意味着他们永远不会得到上限(是的,如果他们根本不想得到它,可能会出现这种情况,但是要求是包括上限)


Seb*_*ara 6

返回1到10之间的随机数:

Math.floor((Math.random() * 10) + 1);
Run Code Online (Sandbox Code Playgroud)

结果可能是: 3

试试自己:这里

-

或使用lodash/unexcore:

_.random(min, max)

文档: - lodash - undescore


Hus*_*931 6

基本上像骰子一样返回 1-6,

return Math.round(Math.random() * 5 + 1);
Run Code Online (Sandbox Code Playgroud)


Aru*_*rma 5

尽管有许多答案,但结果几乎相同。我想补充一下我的答案并解释其工作原理。因为重要的是要了解其工作原理,而不是复制粘贴一行代码。生成随机数只不过是简单的数学运算。

码:

function getR(lower, upper) {

  var percent = (Math.random() * 100);
  // this will return number between 0-99 because Math.random returns decimal number from 0-0.9929292 something like that
  //now you have a percentage, use it find out the number between your INTERVAL :upper-lower 
  var num = ((percent * (upper - lower) / 100));
  //num will now have a number that falls in your INTERVAL simple maths
  num += lower;
  //add lower to make it fall in your INTERVAL
  //but num is still in decimal
  //use Math.floor>downward to its nearest integer you won't get upper value ever
  //use Math.ceil>upward to its nearest integer upper value is possible
  //Math.round>to its nearest integer 2.4>2 2.5>3   both lower and upper value possible
  console.log(Math.floor(num), Math.ceil(num), Math.round(num));
}
Run Code Online (Sandbox Code Playgroud)


Ray*_*tor 5

该函数可以生成一个介于(含)最小和最大数之间的随机整数:

function randomNumber(min, max) {
  if (min > max) {
    let temp = max;
    max = min;
    min = temp;
  }

  if (min <= 0) {
    return Math.floor(Math.random() * (max + Math.abs(min) + 1)) + min;
  } else {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }
}
Run Code Online (Sandbox Code Playgroud)

例子:

randomNumber(-2, 3); // can be -2, -1, 0, 1, 2 and 3
randomNumber(-5, -2); // can be -5, -4, -3 and -2
randomNumber(0, 4); // can be 0, 1, 2, 3 and 4
randomNumber(4, 0); // can be 0, 1, 2, 3 and 4
Run Code Online (Sandbox Code Playgroud)


Axe*_*xel 5

这个简单的功能很方便,可以在任何情况下使用(经过充分测试)。此外,结果的分布已经过充分测试,100%正确。

function randomInteger(pMin = 1, pMax = 1_000_000_000)
//Author: Axel Gauffre. 
//Here: /sf/answers/5224586811/
//Inspired by: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_number_between_two_values
//
//This function RETURNS A RANDOM INTEGER between pMin (INCLUDED) and pMax (INCLUDED).
//  - pMin and pMax should be integers.
//  - HOWEVER, if pMin and/or pMax are FLOATS, they will be ROUNDED to the NEAREST integer.
//  - NEGATIVE values ARE supported.
//  - The ORDER of the 2 arguments has NO consequence: If pMin > pMax, then pMin and pMax will simply be SWAPPED.
//  - If pMin is omitted, it will DEFAULT TO 1.
//  - If pMax is omitted, it will DEFAULT TO 1 BILLION.
//
//This function works in ANY cases (fully tested).
//Also, the distribution of the results has been fully tested and is 100% correct.
{
    pMin = Math.round(pMin);
    pMax = Math.round(pMax);
    if (pMax < pMin) { let t = pMin; pMin = pMax; pMax = t;}
    return Math.floor(Math.random() * (pMax+1 - pMin) + pMin);
}
Run Code Online (Sandbox Code Playgroud)