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


当前回答

我制作了这个函数,它考虑了min、max、exclude(要排除的整数列表)和seed(如果您需要种子随机生成器)等选项。

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

其他回答

使用此函数获取给定范围内的随机数:

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

使用计算机程序生成随机数后,如果选取的数字是初始数字的一部分或全部,则仍将其视为随机数。但如果它被改变了,数学家就不接受它是一个随机数,他们可以称它为一个有偏数。

但是,如果您正在为一项简单的任务开发一个程序,则不需要考虑这种情况。但是,如果你正在开发一个程序,为有价值的东西(如彩票程序或赌博游戏)生成随机数,那么如果你不考虑上述情况,你的程序将被管理层拒绝。

所以对于这类人,我的建议是:

使用Math.random()生成一个随机数(说这个n):

Now for [0,10) ==>  n*10 (i.e. one digit) and for[10,100) ==> n*100 (i.e., two digits) and so on. Here square bracket indicates that the boundary is inclusive and a round bracket indicates the boundary is exclusive.

然后删除小数点后的其余部分。(即,获得发言权)-使用Math.floor()。这可以完成。

如果你知道如何读取随机数表来选择一个随机数,那么你知道上面的过程(乘以1、10、100等)不会违反我在开头提到的过程(因为它只改变小数点的位置)。

研究以下示例,并根据您的需要进行开发。

如果你需要一个样本[0,9],那么n10的下限是你的答案,如果你需要[0,99],那么n100的下限就是你的答案等等。

现在让我们进入您的角色:

您已要求提供特定范围内的数字。(在这种情况下,你在这个范围内是有偏差的。通过掷骰子从[1,6]中取一个数字,那么你就有偏差到[1,6],但当且仅当骰子无偏差时,它仍然是一个随机数。)

所以考虑一下你的范围==>[78,247]范围内的元素数=247-78+1=170;(因为两个边界都包含在内)。

/* Method 1: */
    var i = 78, j = 247, k = 170, a = [], b = [], c, d, e, f, l = 0;
    for(; i <= j; i++){ a.push(i); }
    while(l < 170){
        c = Math.random()*100; c = Math.floor(c);
        d = Math.random()*100; d = Math.floor(d);
        b.push(a[c]); e = c + d;
        if((b.length != k) && (e < k)){  b.push(a[e]); }
        l = b.length;
    }
    console.log('Method 1:');
    console.log(b);

/* Method 2: */

    var a, b, c, d = [], l = 0;
    while(l < 170){
        a = Math.random()*100; a = Math.floor(a);
        b = Math.random()*100; b = Math.floor(b);
        c = a + b;
        if(c <= 247 || c >= 78){ d.push(c); }else{ d.push(a); }
        l = d.length;
    }
    console.log('Method 2:');
    console.log(d);

注意:在方法一中,首先我创建了一个包含所需数字的数组,然后将它们随机放入另一个数组中。

在方法二中,随机生成数字,并检查这些数字是否在您需要的范围内。然后将其放入数组中。在这里,我生成了两个随机数,并使用它们的总数通过最小化获得有用数字的失败率来最大化程序的速度。然而,将生成的数字相加也会产生一些偏差。所以我推荐我的第一种方法来生成特定范围内的随机数。

在这两种方法中,控制台都会显示结果(在Chrome中按F12打开控制台)。

最低和最高之间的随机整数:

function randomRange(low, high) {
  var range = (high-low);
  var random = Math.floor(Math.random()*range);
  if (random === 0) {
    random += 1;
  }
  return low + random;
}

这不是最优雅的解决方案,而是快速的解决方案。

当两个输入都是整数时,此实现可以正常工作。

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

使用现代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);
};