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; }
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()
来生成随机整数会导致分布不均匀,min
和max
出现的概率大约是其他数字的一半。建议使用Math.floor()
来保证均匀分布。
密码学安全问题
Math.random()
方法不提供密码学安全的随机数,不要将其用于与安全相关的任何事情。应使用Web Crypto API,特别是window.crypto.getRandomValues()
方法。
参数输入问题
如果传入非整数值或较大的数字在前,可能会得到不理想的结果。在实际应用中,可以添加参数检查代码来处理这些情况。