【唯一随机数】如何用JavaScript的Set生成唯一的随机数?

大家好😘,我是珑墨,今天给大家分享 如何用JavaScript的Sets生成唯一的随机数? ,嘎嘎的😍,看下面。

一、前言

大伙儿都知道,JS带有许多内置函数。其中一个内置函数,它能生成一个随机浮点数,然后可以将其处理为整数------Math.random()

但是,如果希望生成一系列唯一的随机数并在代码中创建更多随机效果,则需要为自己想出一个自定义解决方案,因为该方法本身无法为你完成此操作。

在 JS 中生成一系列唯一随机数的方法之一是使用Math.random()。我们使用 set 的原因是 set 的元素是唯一的。我们可以迭代地生成随机整数并将其插入到集合中,直到我们得到我们想要的整数数量。

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

二、上代码

先列个步骤:

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

以下是代码如何组合在一起的快速示例:

复制代码
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: 立即将它们的数字插入到集合中...
  return Array.from(uniqueNumbers);
}
// 要从给定范围生成多少个数字
console.log(generateRandomNumbers(5, 5, 10)); // [8, 9, 5, 7, 6]

上面示例先创建一个新对象,然后生成随机数并将其添加到集合中,直到我们所需的整数个数包含在集合中。我们返回数组的原因是因为它们更容易使用。

但是,需要注意的一点是,要生成的整数数应小于范围的上限加 1。否则,代码将永远运行。你可以向代码中添加 an 以确保始终如此:count``max + 1

复制代码
function generateRandomNumbers(count, min, max) {
  // 判断检查count 
  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)); // [8, 9, 5, 7, 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'
];

// rest of code

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

复制代码
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]);

在原始代码中,该函数被记录到控制台中。这一次,我们将构造一个调用该函数的新变量:

复制代码
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);

然后,当我们结合之前的所有示例,我们会得到最终的代码:

复制代码
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 cannot be greater than the upper limit of range";
  } 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); // ['Y', 'W', 'F', 'P', 'Z']

因此,在此示例中,我们通过随机选择数组中的一些字母来创建新的字母表数组。englishAlphabets

如果你想对数组中的元素进行随机排序:

复制代码
generateRandomNumbers(englishAlphabets.length, 0, 25);

三、结语

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

感谢j览本文,共同进步🤞,若有更好的观点,欢迎评论区讨论哈🌹。

相关推荐
L***d6701 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
少云清1 小时前
【功能测试】6_Web端抓包 _Fiddler抓包工具的应用
前端·功能测试·fiddler
周杰伦fans1 小时前
C# - Task 是什么?想象一下你在餐厅点餐
服务器·开发语言·c#
芳草萋萋鹦鹉洲哦1 小时前
【tauri+rust】App会加载白屏,有时显示在左上角显示一小块,如何优化
开发语言·后端·rust
前端世界1 小时前
float 还是 double?用储罐体积计算带你看懂 C 语言浮点数的真实世界坑
java·c语言·开发语言
豐儀麟阁贵1 小时前
8.5在方法中抛出异常
java·开发语言·前端·算法
zengyuhan5031 小时前
Windows BLE 开发指南(Rust windows-rs)
前端·rust
Bro_cat1 小时前
Java基础
java·开发语言·面试
滨HI01 小时前
C++ opencv简化轮廓
开发语言·c++·opencv