在JavaScript Math.random()中生成两个数字之间的随机数

问题描述 投票:1523回答:16

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

javascript random
16个回答
1897
投票

Important

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

如果你想得到1(只有1)和6之间的随机整数,你会计算:

Math.floor(Math.random() * 6) + 1  

哪里:

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

8
投票

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

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

固定版本。


6
投票

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

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

结果可能是:randomBetween(-10,15)//or.. randomBetween(10,20)//or... randomBetween(-200,-100)

试试自己: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

--

或使用lodash /下划线:

Math.floor((Math.random() * 10) + 1);

文件: - 3 - here


5
投票

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

码:

_.random(min, max)

4
投票

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

lodash

3
投票

在@ Francisc的答案中添加基于undescore版本的固定精度版本的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)); }

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

所以:

float

并为int答案

int

1
投票

function randomFloatFromInterval (min, max, fractionDigits) { const fractionMultiplier = Math.pow(10, fractionDigits) return Math.round( (Math.random() * (max - min) + min) * fractionMultiplier, ) / fractionMultiplier } 速度快,适用于多种用途,但如果您需要加密安全值(它不安全),或者您需要来自完全统一的无偏分布的整数(其他答案中使用的乘法方法产生某些值稍微更多),则它是不合适的。经常比其他人)。

在这种情况下,我们可以使用randomFloatFromInterval(1,3,4) // => 2.2679, 1.509, 1.8863, 2.9741, ... 生成安全整数,并拒绝任何我们无法均匀映射到目标范围的生成值。这将会更慢,但除非您生成极大数量的值,否则它不应该很重要。

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

randomFloatFromInterval(1,3,0) // => 1, 2, 3

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

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.

0
投票

这应该工作:

number

0
投票

我发现了一种使用ES6默认参数执行此操作的新方法。它非常漂亮,因为它允许一个参数或两个参数。这里是:

BigInt

-5
投票

我发现上面的Francisc的解决方案没有在结果中包含最小或最大数字,所以我改变了它:

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]

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

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


249
投票

Math.random()

来自Mozilla开发者网络文档:

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

Math.floor(Math.random() * (max - min + 1)) + 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;

82
投票

其他方案:

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

47
投票

TL; DR

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

得到随机数generateRandomInteger(-20, 20);

下面的说明

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

对?

i = min <= 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 ie [0,1]的范围与Math.random()函数结果非常相似。不是吗?

Math.random()函数返回[0,1]范围内的浮点伪随机数;也就是说,从0(含)到最高但不包括1(不包括)

例如,

Case r = 0

QZXSOP + 0 *(QZXSUBZZXSOP)=来自

Case r = 1

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

Random Case using Math.random 0 <= r < 1

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

上述结果X是随机数字。但是由于Math.random(),我们的左边界是包容性的,右边界是独占的。要包含我们的右边界,我们将右边界增加1并将结果置于底层。

min

To get the random number

max;


20
投票

或者,在min

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

19
投票
generateRandomInteger(-20, 20)

19
投票

的jsfiddle:Underscore

随机整数:要获得_.random(min, max) var x = 6; // can be any number var rand = Math.floor(Math.random()*x) + 1; 之间的随机整数,请使用以下代码

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

随机浮点数:要获得minmax之间的随机浮点数,请使用以下代码

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

参考:min


13
投票

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

max

E.g

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

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

© www.soinside.com 2019 - 2024. All rights reserved.