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


当前回答

这里有一个函数,它生成一个介于最小值和最大值之间的随机数,两者都包含在内。

const randomInt = (max, min) => Math.round(Math.random() * (max - min)) + min;

其他回答

我想用一个例子来解释:

函数在JavaScript中生成5到25范围内的随机整数

概述:(i) 首先将其转换为范围-从0开始。(ii)然后将其转换为所需的范围(然后将非常易于完成)。

所以基本上,如果你想生成从5到25的随机整数,那么:

第一步:将其转换为范围-从0开始

从“max”和“min”中减去“lower/minimum number”。即

(5-5) - (25-5)

因此,范围将为:

0-20 ...正确的

第二步

现在,如果您希望两个数字都包含在范围内,即“0和20”,则公式为:

数学方程式:Math.floor((Math.random()*21))

一般公式:Math.floor((Math.random()*(max min+1)))

现在,如果我们将减去的/最小的数字(即5)添加到范围中,那么我们可以自动获得0到20的范围=>5到25

第三步

现在将减去的差值加在等式(即5)中,并将“Math.floor”添加到整个等式中:

数学方程式:Math.floor((Math.random()*21)+5)

一般公式:Math.floor((Math.random()*(max-min+1))+min)

因此,最终函数将是:

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

Mozilla开发者网络页面上有一些示例:

/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */
function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
}

/**
 * Returns a random integer between min (inclusive) and max (inclusive).
 * The value is no lower than min (or the next integer greater than min
 * if min isn't an integer) and no greater than max (or the next integer
 * lower than max if max isn't an integer).
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

这是背后的逻辑。这是一个简单的三条规则:

Math.random()返回一个介于0(含)和1(不含)之间的数字。所以我们有一个这样的间隔:

[0 .................................... 1)

现在,我们需要一个介于min(含)和max(不含)之间的数字:

[0 .................................... 1)
[min .................................. max)

我们可以使用Math.random获取[min,max)区间的对应值。但是,首先我们应该通过从第二个区间减去min来稍微考虑一下问题:

[0 .................................... 1)
[min - min ............................ max - min)

这给出了:

[0 .................................... 1)
[0 .................................... max - min)

我们现在可以应用Math.random,然后计算对应的。让我们选择一个随机数:

                Math.random()
                    |
[0 .................................... 1)
[0 .................................... max - min)
                    |
                    x (what we need)

因此,为了找到x,我们需要:

x = Math.random() * (max - min);

别忘了把min加回来,这样我们就可以得到[分钟,最大值]间隔内的数字:

x = Math.random() * (max - min) + min;

这是MDN的第一个函数。第二个,返回一个介于min和max之间的整数,两者都包含在内。

现在,对于整数,可以使用round、ceil或floor。

您可以使用Math.round(Math.random()*(max-min))+min,但这给出了一个非偶数分布。最小值和最大值都只有大约一半的掷骰机会:

min...min+0.5...min+1...min+1.5   ...    max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘   ← Math.round()
   min          min+1                          max

如果将最大值排除在区间之外,那么它比最小值滚动的机会更小。

使用Math.floor(Math.random()*(max-min+1))+min,您可以获得完全均匀的分布。

 min...  min+1...    ...      max-1... max....   (max+1 is excluded from interval)
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘   ← Math.floor()
   min     min+1               max-1    max

你不能在这个等式中使用ceil()和-1,因为max现在的掷骰机会稍微少了一些,但你也可以掷(不需要的)min-1的结果。

一个名为randUpTo的函数,它接受一个数字并返回一个介于0和该数字之间的随机整数:

var randUpTo = function(num) {
    return Math.floor(Math.random() * (num - 1) + 0);
};

一个名为randBetween的函数,它接受表示一个范围的两个数字,并返回这两个数字之间的随机整数:

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

一个名为randFromTill的函数,它接受表示范围的两个数字,并返回一个介于min(含)和max(不含)之间的随机数

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

一个名为randFromTo的函数,接受表示范围的两个数字,并返回一个介于min(含)和max(含)之间的随机整数:

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

我制作了这个函数,它考虑了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

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

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

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

使用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打开控制台)。