有没有办法用JavaScript生成指定范围内的随机数?

例如:指定范围从1到6,随机数可以是1、2、3、4、5或6。


当前回答

对于大数字。

var min_num = 900;
var max_num = 1000;
while(true){
    
    let num_random = Math.random()* max_num;
    console.log('input : '+num_random);
    if(num_random >= min_num){
        console.log(Math.floor(num_random));
       break; 
    } else {
        console.log(':::'+Math.floor(num_random));
    }
}

其他回答

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.

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

常量随机整数=(最小值,最大值)=>{常量范围=最大值-最小值;常量maxGeneratedValue=0xFFFFFFFF;const possibleResultValues=范围+1;const possibleGeneratedValues=最大生成值+1;常量余数=possibleGeneratedValues%possibleResultValues;const maxUnbiased=maxGeneratedValue-余数;if(!Number.isInteger(min)||!Number.isInteger(最大值)||max>Number.max_SAFE_INTEGER||min<Number.min_SAFE_INDEGER){抛出新错误(“参数必须是安全整数。”);}否则如果(范围>maxGeneratedValue){抛出新错误(`范围为${Range}(从${min}到${max})>${maxGeneratedValue}。`);}否则,如果(最大值<最小值){抛出新错误(`max(${max})必须>=min(${min})。`);}否则如果(min==max){返回最小值;} let生成;做{generated=crypto.getRandomValues(新Uint32Array(1))[0];}而(生成>maxUnbiased);return min+(生成的%possibleResultValues);};console.log(randomInteger(-8,8));//-2.console.log(randomInteger(0,0));//0console.log(随机整数(0,0xFFFFFFFF));//944450079console.log(随机整数(-1,0xFFFFFFFF));//错误:4294967296覆盖-1到4294967295的范围>4294967295。console.log(new Array(12).fill().map(n=>randomInteger(8,12)));// [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9]

其他解决方案:

(数学随机()*6|0)+1~~(数学随机()*6)+1

联机尝试

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

随机整数:要获得最小值和最大值之间的随机整数,请使用以下代码

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

随机浮点数:要获得最小值和最大值之间的随机浮点数,请使用以下代码

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

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

获取0到400之间的随机整数

let rand=数学舍入(Math.random()*400)document.write(兰特)

获取200到1500之间的随机整数

让范围={min:200,max:1500}设delta=范围.max-范围.minconst rand=数学舍入(range.min+Math.random()*delta)document.write(兰特)

使用函数

函数randBetween(最小值,最大值){设delta=最大值-最小值return Math.round(min+Math.random()*delta)}document.write(randBetween(10,15));

//JavaScript ES6箭头函数常量randBetween=(最小值,最大值)=>{设delta=最大值-最小值return Math.round(min+Math.random()*delta)}document.write(randBetween(10,20))

此函数可以生成介于(包括)最小值和最大值之间的随机整数:

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;
  }
}

例子:

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