在JavaScript中生成特定范围内的随机整数

2506

我该如何在 JavaScript 中生成在两个指定变量之间的随机整数,例如 x = 4y = 8 会输出 4, 5, 6, 7, 8 中的任意一个?


2
这里有一个有用的代码片段:https://gist.github.com/kerimdzhanov/7529623 - Dan K.K.
15
顺便提一下:对于那些使用npm并寻找快速、可靠和现成解决方案的人,可以使用lodash.random。它只需很小的空间(它仅会导入方法本身而非整个lodash),可轻松调用。 - Aurelio
如果需要加密安全,请使用https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues。 - happy
你能在关于数字范围的问题中更加明确吗?特别是零。负数呢?(“有些文献将自然数排除零,有时将自然数与零一起称为整数”。)(但是不要包含“编辑:”,“更新:”或类似内容——问题应该看起来像今天写的。) - Peter Mortensen
2
这里有很多答案回答了一些不同的问题(它们并不是真正的答案)。就像一些用户只阅读了“生成随机整数”,却从未看到“在特定范围内”的部分(甚至是带有[4; 8]示例的正文)。 - Peter Mortensen
Java的对应问题(包括删除的102个答案):*如何在Java中生成特定范围内的随机整数?* - Peter Mortensen
40个回答

1

我的生成0到n之间随机数的方法,其中n <= 10(不包括n):

Math.floor((Math.random() * 10) % n)

1
但问题是“在特定范围内”。 - Peter Mortensen

0

当两个输入都是整数时,此实现可行。

function randomRange(myMin, myMax) {
  return Math.floor(
    Math.random() * (Math.ceil(myMax) - Math.floor(myMin) + 1) + myMin
  );
}

0

使用现代JavaScript + Lodash

const generateRandomNumbers = (max, amount) => {
  const numbers = [...Array(max).keys()];
  const randomNumbers = sampleSize(numbers, amount);

  return randomNumbers.sort((a, b) => a - b);
};

另外,还有一个TypeScript版本:

const generateRandomNumbers = (max: number, amount: number) => {
  const numbers = [...Array(max).keys()];
  const randomNumbers: number[] = sampleSize(numbers, amount);

  return randomNumbers.sort((a: number, b: number) => a - b);
};

0
我写了这个函数,它考虑了像最小值、最大值、排除(要排除的整数列表)和种子(以防您想要一个有种子的随机生成器)等选项。
get_random_int = function(args={})
{
    let def_args =
    {
        min: 0,
        max: 1,
        exclude: false,
        seed: Math.random
    }

    args = Object.assign(def_args, args)

    let num = Math.floor(args.seed() * (args.max - args.min + 1) + args.min)

    if(args.exclude)
    {
        let diff = args.max - args.min
        let n = num

        for(let i=0; i<diff*2; i++)
        {
            if(args.exclude.includes(n))
            {
                if(n + 1 <= args.max)
                {
                    n += 1
                }

                else
                {
                    n = args.min
                }
            }

            else
            {
                num = n
                break
            }
        }
    }

    return num
}

它可以像这样使用:

let n = get_random_int
(
    {
        min: 0,
        max: some_list.length - 1,
        exclude: [3, 6, 5],
        seed: my_seed_function
    }
)

或者更简单地说:

let n = get_random_int
(
    {
        min: 0,
        max: some_list.length - 1
    }
)

然后你可以这样做:

let item = some_list[n]

要点:https://gist.github.com/madprops/757deb000bdec25776d5036dae58ee6e


0

为了获得最佳性能,您可以简单地使用:

var r = (Math.random() * (maximum - minimum + 1) ) << 0

但它不会在指定的范围内输出,例如[4;8]。偏移量4不存在。你能修复吗?这并没有回答问题(我强调):“如何在JavaScript中生成两个指定变量之间的随机整数,例如x = 4和y = 8将输出4、5、6、7、8中的任何一个?”换句话说,在指定的范围/闭区间内生成随机数(例如示例中的[4;8])。即使标题也说“在特定范围内”。 - Peter Mortensen
@PeterMortensen 那就是我所做的... 2个名为maximumminimum的变量。 - Koby Douek
不,你没有。"minimum" 必须在某个地方被有效地用作纯偏移量。这里它只是用于缩放。 - Peter Mortensen

0
  • random(min, max) 生成一个在min(包含)和max(不包含)之间的随机数

  • Math.floor 将数字向下舍入到最近的整数

    function generateRandomInteger(min, max) { 
          return Math.floor(random(min, max)) 
      }
     

如果想要生成一个介于4和8之间的随机整数(包括4和8),可以使用以下参数调用上述函数:

generateRandomInteger(4, 9)

这与之前的答案有何不同? - Peter Mortensen

0
// Example
function ourRandomRange(ourMin, ourMax) {
    return Math.floor(Math.random() * (ourMax - ourMin + 1)) + ourMin;
}

ourRandomRange(1, 9);

// Only change code below this line.
function randomRange(myMin, myMax) {
    var a = Math.floor(Math.random() * (myMax - myMin + 1)) + myMin;
    return a; // Change this line
}

// Change these values to test your function
var myRandom = randomRange(5, 15);

为什么要“只更改此行以下的代码”?它看起来像是freeCodeCamp或类似网站会生成的。你能否将其清理一下?(但不要包含“编辑:”,“更新:”或类似内容 - 答案应该看起来像是今天写的。) - Peter Mortensen

0
所有现有的答案都会生成一个在某个最小值和最大值之间(或者可能是在零和最大值之间)的随机数,但我想要的是最随机的整数
由于Math.random()会生成一个16位小数,获取最大随机正整数的方法如下:
Math.floor(Math.random()*10**16)

-3

已接受答案存在的问题

值得注意的是已接受答案未能正确处理min大于max的情况。以下是一个例子:

min = Math.ceil(2);
max = Math.floor(1);
for(var i = 0; i < 25; i++) {
  console.log(Math.floor(Math.random() * (max - min + 1)) + min);
}

此外,如果您不熟悉这个小算法,它可能会有点冗长和不清晰。
Randojs为什么是更好的解决方案呢?
Randojs可以自动处理最小值大于最大值的情况(而且它是加密安全的):

for(var i = 0; i < 25; i++) console.log(rando(2, 1));
<script src="https://randojs.com/1.0.0.js"></script>

它还处理负数、零和其他你所期望的一切。如果你需要使用浮点数或其他变量类型,也有相应的选项,但我不会在这里讨论它们。它们在网站上,如果需要可以深入了解。最后一个原因非常明显。从风格上来说,它更加清晰易读。


简而言之,给我解决方案...

randojs.com使得这个和许多其他常见的随机性问题变得强大、可靠,同时也像这样简单易读:

console.log(rando(20, 30));
<script src="https://randojs.com/1.0.0.js"></script>


14
使用库来解决这种问题有些过头了。这里的重点是理解/学习如何解决它,而不是通过库将问题处理成黑盒子。 - nook
他们现在使用的是2.0.0版本。虽然我不确定这是否是LTS版本,但在升级之前我会等待确认。 - Max Carroll
1
他们也有一个 npm 包,我相信。 - Max Carroll
现在的标准版本是2.0.0。1.0.0版本很少被使用,只有那些更喜欢基于Math.random()计算而不是加密安全结果的人才会使用它。如果您也是这样的用户,升级到新版本是安全的! - Aaron Plocharczyk

-3

我在网页上找到了一些有趣的内容:

function randomInt(e,t){return Math.floor(Math.random()*(t-e+1)+e)}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接