有没有办法用JavaScript生成指定范围内的随机数?
例如:指定范围从1到6,随机数可以是1、2、3、4、5或6。
有没有办法用JavaScript生成指定范围内的随机数?
例如:指定范围从1到6,随机数可以是1、2、3、4、5或6。
当前回答
数学.随机()
返回介于min(包含)和max(包含)之间的整数随机数:
function randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
或介于min(包含)和max(不包含)之间的任意随机数:
function randomNumber(min, max) {
return Math.random() * (max - min) + 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;
**总是很高兴被提醒(Mozilla):
Math.random()不提供加密安全的随机数字。不要将它们用于与安全相关的任何事情。使用Web加密API,更准确地说window.crypto.getRandomValues()方法。
其他回答
根据@Francisc的答案中的int版本添加具有固定精度版本的float:
function randomFloatFromInterval (min, max, fractionDigits) {
const fractionMultiplier = Math.pow(10, fractionDigits)
return Math.round(
(Math.random() * (max - min) + min) * fractionMultiplier,
) / fractionMultiplier
}
so:
randomFloatFromInterval(1,3,4) // => 2.2679, 1.509, 1.8863, 2.9741, ...
对于int答案
randomFloatFromInterval(1,3,0) // => 1, 2, 3
var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;
获取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))
如果您想覆盖负数和正数,并确保其安全,请使用以下方法:
JS解决方案:
function generateRangom(low, up) {
const u = Math.max(low, up);
const l = Math.min(low, up);
const diff = u - l;
const r = Math.floor(Math.random() * (diff + 1)); //'+1' because Math.random() returns 0..0.99, it does not include 'diff' value, so we do +1, so 'diff + 1' won't be included, but just 'diff' value will be.
return l + r; //add the random number that was selected within distance between low and up to the lower limit.
}
Java解决方案:
public static int generateRandom(int low, int up) {
int l = Math.min(low, up);
int u = Math.max(low, up);
int diff = u - l;
int r = (int) Math.floor(Math.random() * (diff + 1)); // '+1' because Math.random() returns 0..0.99, it does not include 'diff' value, so we do +1, so 'diff + 1' won't be included, but just 'diff' value will be.
return l + r;//add the random number that was selected within distance between low and up to the lower limit.
}
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]