JavaScript中在特定范围内生成随机整数

JavaScript中在特定范围内生成随机整数

技术背景

在JavaScript开发中,经常需要在特定范围内生成随机整数,例如在游戏开发中随机生成角色属性、在抽奖程序中随机选择中奖号码等。JavaScript提供了Math.random()方法来生成一个介于0(包含)和1(不包含)之间的随机小数,基于此可以实现特定范围内随机整数的生成。

实现步骤

生成指定范围内的随机小数

要生成一个介于min(包含)和max(不包含)之间的随机小数,可以使用以下公式:

1
2
3
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}

生成指定范围内的随机整数

要生成一个介于min(包含)和max(包含)之间的随机整数,可以使用以下公式:

1
2
3
4
5
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}

核心代码

生成指定范围内的随机整数的多种实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 方法一:通用的生成指定范围内随机整数的函数
function randomRange(min, max) {
return Math.floor((Math.random() * (max - min + 1)) + min);
}

// 方法二:使用箭头函数的简洁实现
const randomInt = (max, min) => Math.round(Math.random() * (max - min)) + min;

// 方法三:使用闭包的实现
function getRandomizer(bottom, top) {
return function() {
return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
}
}

// 方法四:使用位运算的简洁实现
function randomRangeBitwise(min, max) {
return ~~(Math.random() * (max - min + 1)) + min
}

测试代码示例

1
2
3
4
5
6
7
8
9
10
11
12
// 使用方法一
console.log(randomRange(1, 10));

// 使用方法二
console.log(randomInt(5, 20));

// 使用方法三
var rollDie = getRandomizer(1, 6);
console.log(rollDie());

// 使用方法四
console.log(randomRangeBitwise(-10, -2));

最佳实践

生成不重复的随机整数数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function genRandomNumber(how_many_numbers, min, max) {
var random_number = [];
for (var i = 0; i < how_many_numbers; i++) {
var gen_num = parseInt((Math.random() * (max - min + 1)) + min);
do {
var is_exist = random_number.indexOf(gen_num);
if (is_exist >= 0) {
gen_num = parseInt((Math.random() * (max - min + 1)) + min);
} else {
random_number.push(gen_num);
is_exist = -2;
}
} while (is_exist > -1);
}
return random_number;
}

// 生成5个介于1到10之间的不重复随机整数
console.log(genRandomNumber(5, 1, 10));

生成密码学安全的随机整数

如果需要生成密码学安全的随机整数,可以使用window.crypto.getRandomValues()方法:

1
2
3
4
5
function cs(x, y) {
return x + (y - x + 1) * crypto.getRandomValues(new Uint32Array(1))[0] / 2**32 | 0;
}

console.log(cs(4, 8));

常见问题

分布不均匀问题

使用Math.round()来生成随机整数会导致分布不均匀,minmax出现的概率大约是其他数字的一半。建议使用Math.floor()来保证均匀分布。

密码学安全问题

Math.random()方法不提供密码学安全的随机数,不要将其用于与安全相关的任何事情。应使用Web Crypto API,特别是window.crypto.getRandomValues()方法。

参数输入问题

如果传入非整数值或较大的数字在前,可能会得到不理想的结果。在实际应用中,可以添加参数检查代码来处理这些情况。


JavaScript中在特定范围内生成随机整数
https://119291.xyz/posts/2025-05-14.generate-random-integers-in-javascript/
作者
ww
发布于
2025年5月14日
许可协议