📅  最后修改于: 2023-12-03 14:58:41.179000             🧑  作者: Mango
在 JavaScript 中,我们可以使用内置函数 Math.random()
来生成伪随机数。生成的随机数是一个大于等于 0,小于 1 的浮点数。
如果我们需要生成一个介于两个整数之间的随机整数,可以使用下面这段代码:
/**
* 生成介于 min 和 max(不含 max)之间的随机整数
* @param {number} min 左边界(包含)
* @param {number} max 右边界(不包含)
* @return {number} 随机整数
*/
function randomInt(min, max) {
if (typeof min !== 'number' || typeof max !== 'number') {
throw new Error('min 和 max 必须是数字');
}
if (min >= max) {
throw new Error('min 必须小于 max');
}
// 利用 Math.floor 将浮点数向下取整
// 例如 Math.floor(1.5) 返回 1,Math.floor(2.7) 返回 2
return Math.floor(Math.random() * (max - min)) + min;
}
// 生成 0、1、2、3、4 中的随机整数
console.log(randomInt(0, 5));
这段代码中,我们给出了一个 randomInt
函数,接收两个参数 min
和 max
,返回一个介于 min
和 max
(不含 max
)之间的随机整数。
我们使用 (max - min)
计算出范围的长度,然后生成一个介于 0 和 max - min
之间的随机整数,再加上 min
,就得到了随机整数所在的范围。
如果我们有一个数组,如何将其中的元素随机交换位置呢?可以使用洗牌算法:
/**
* 随机排序数组
* @param {Array} arr 要排序的数组
* @return {Array} 排序后的新数组
*/
function shuffle(arr) {
if (!Array.isArray(arr)) {
throw new Error('参数必须是数组');
}
// 洗牌算法
// 从最后一个元素开始,向前遍历数组
// 每个元素都从一个随机位置交换过来
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
// 随机排序数组
console.log(shuffle([1, 2, 3, 4, 5]));
这段代码中,我们给出了一个 shuffle
函数,接收一个数组 arr
,返回一个新数组,其中的元素顺序是随机的。
我们使用洗牌算法实现,从最后一个元素开始向前遍历数组,每个元素都从一个随机位置交换过来。这样做可以保证每个元素被交换的概率相等,从而保证洗牌的公平性。
JavaScript 中的随机数生成并不是真正意义上的随机,而是伪随机。使用 Math.random()
生成的随机数是一个大于等于 0,小于 1 的浮点数,使用适当的计算可以生成任意范围内的随机整数。
在实际开发中,我们经常需要对数组进行随机排序。可以使用洗牌算法,从最后一个元素开始向前遍历数组,每个元素都从一个随机位置交换过来,保证随机性和公平性。