📜  随机数 - Javascript (1)

📅  最后修改于: 2023-12-03 14:58:41.179000             🧑  作者: Mango

随机数 - JavaScript

在 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 函数,接收两个参数 minmax,返回一个介于 minmax(不含 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 的浮点数,使用适当的计算可以生成任意范围内的随机整数。

在实际开发中,我们经常需要对数组进行随机排序。可以使用洗牌算法,从最后一个元素开始向前遍历数组,每个元素都从一个随机位置交换过来,保证随机性和公平性。