在 JavaScript 中使用 Sets 生成唯一的随机数

原文信息: 查看原文查看原文

Generating Unique Random Numbers In JavaScript Using Sets

- Amejimaobari Ollornwi

快速摘要:想要在你的 JavaScript 代码中创建更多的随机效果吗?仅使用 Math.random() 方法,由于其局限性,不足以生成唯一的随机数。Amejimaobari Ollornwi 将解释如何使用 Set 对象生成一系列唯一的随机数,如何将这些随机数用作数组的索引,并探索随机化的一些实际应用。

JavaScript 提供了许多内置函数,允许你执行许多不同的操作。其中之一是 Math.random() 方法,它生成一个随机的浮点数,然后可以将其转换为整数。

然而,如果你希望生成一系列唯一的随机数,并在代码中创建更多的随机效果,你需要自己设计一个自定义解决方案,因为仅凭 Math.random() 方法本身无法做到这一点。

在本文中,我们将学习如何绕过这个问题,并使用 JavaScript 中的 Set 对象生成一系列唯一的随机数,然后我们可以使用这些随机数在我们的代码中创建更多的随机效果。

注意:本文假设你知道如何在 JavaScript 中生成随机数,以及如何使用集合和数组。

生成一系列唯一的随机数

在 JavaScript 中生成一系列唯一随机数的一种方法是使用 Set 对象。我们使用集合的原因是集合的元素是唯一的。我们可以迭代地生成并插入随机整数到集合中,直到我们得到我们想要的整数数量。

由于集合不允许重复元素,它们将作为过滤器,去除所有生成并插入到其中的重复数字,以便我们得到一组唯一的整数。

我们将这样进行工作:

  1. 创建一个 Set 对象。
  2. 定义要生成多少个随机数以及要使用哪个数字范围。
  3. 生成每个随机数,并立即将数字插入到 Set 中,直到 Set 被填充到一定数量的数字。

以下是代码的快速示例:

function generateRandomNumbers(count, min, max) {
  // 1: 创建一个 `Set` 对象
  let uniqueNumbers = new Set();
  while (uniqueNumbers.size < count) {
    // 2: 生成每个随机数
    uniqueNumbers.add(Math.floor(Math.random() * (max - min + 1)) + min);
  }
  // 3: 立即将这些数字插入到 Set 中...
  return Array.from(uniqueNumbers);
}
// ...设置从给定范围生成多少个数字
console.log(generateRandomNumbers(5, 5, 10));

代码的作用是创建一个新的 Set 对象,然后生成并添加随机数到集合中,直到集合包含了我们所需的整数数量。我们返回一个数组的原因是它们更容易使用。

然而,需要注意的一点是,你想要生成的整数数量(代码中由 count 表示)应该小于你的范围上限加一(代码中由 max + 1 表示)。否则,代码将永远运行。你可以在代码中添加一个 if 语句来确保情况总是如此:

function generateRandomNumbers(count, min, max) {
  // if 语句检查 `count` 是否小于 `max + 1`
  if (count > max + 1) {
    return "count 不能大于范围的上限";
  } else {
    let uniqueNumbers = new Set();
    while (uniqueNumbers.size < count) {
      uniqueNumbers.add(Math.floor(Math.random() * (max - min + 1)) + min);
    }
    return Array.from(uniqueNumbers);
  }
}
console.log(generateRandomNumbers(5, 5, 10));

使用一系列唯一的随机数作为数组索引

生成一系列随机数是一回事。使用它们是另一回事。

能够使用一系列随机数与数组一起工作,可以解锁许多可能性:你可以在音乐应用中用来打乱播放列表,随机抽样数据进行分析,或者像我一样,在记忆游戏中打乱瓷砖

让我们从上一个示例的代码开始,并在此基础上返回随机字母。首先,我们将构建一个字母数组:

const englishAlphabets = [
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
];

// 其余代码

然后我们 map 数字范围内的字母:

const englishAlphabets = [
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
];

// generateRandomNumbers()

const randomAlphabets = randomIndexes.map((index) => englishAlphabets[index]);

在原始代码中,generateRandomNumbers() 函数被记录在控制台上。这次,我们将构建一个新变量,调用该函数,以便它可以被 randomAlphabets 使用:

const englishAlphabets = [
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
];

// generateRandomNumbers()

const randomIndexes = generateRandomNumbers(5, 0, 25);
const randomAlphabets = randomIndexes.map((index) => englishAlphabets[index]);

现在我们可以像以前一样将输出记录到控制台上,以查看结果:

const englishAlphabets = [
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
];

// generateRandomNumbers()

const randomIndexes = generateRandomNumbers(5, 0, 25);
const randomAlphabets = randomIndexes.map((index) => englishAlphabets[index]);
console.log(randomAlphabets);

当我们将 generateRandomNumbers() 函数定义重新放回去时,我们得到了最终的代码:

const englishAlphabets = [
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
];
function generateRandomNumbers(count, min, max) {
  if (count > max + 1) {
    return "count 不能大于范围的上限";
  } else {
    let uniqueNumbers = new Set();
    while (uniqueNumbers.size < count) {
      uniqueNumbers.add(Math.floor(Math.random() * (max - min + 1)) + min);
    }
    return Array.from(uniqueNumbers);
  }
}
const randomIndexes = generateRandomNumbers(5, 0, 25);
const randomAlphabets = randomIndexes.map((index) => englishAlphabets[index]);
console.log(randomAlphabets);

所以,在这个例子中,我们通过随机选择 englishAlphabets 数组中的一些字母来创建一个新的字母数组。

如果你想要在 englishAlphabets 数组中打乱元素,可以将 englishAlphabets.length 作为计数参数传递给 generateRandomNumbers 函数。这就是我的意思:

generateRandomNumbers(englishAlphabets.length, 0, 25);

总结

在本文中,我们讨论了如何在 JavaScript 中创建随机化,包括如何生成一系列唯一的随机数,如何将这些随机数用作数组的索引,以及随机化的一些实际应用。

学习软件开发中任何东西的最好方法是通过消费内容,并通过实践来加强你从内容中获得的任何知识。所以,不要就此止步。运行本教程中的示例(如果你还没有这么做),与它们玩耍,想出你自己独特的解决方案,也不要忘记分享你的好作品。再见!

分享于 2024-08-31

访问量 77

预览图片