【唯一随机数】如何用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览本文,共同进步🤞,若有更好的观点,欢迎评论区讨论哈🌹。

相关推荐
IT_陈寒2 分钟前
JavaScript的异步地狱,我差点没爬出来
前端·人工智能·后端
光影少年3 分钟前
Webpack打包性能优化方面的经验
前端·webpack·性能优化
NEGl DRYN4 分钟前
Go基础之环境搭建
开发语言·后端·golang
AI木马人5 分钟前
20.人工智能实战:大模型项目如何从 Demo 走向生产?一套可落地的上线验收清单与工程治理方案
java·开发语言·人工智能
CandyU27 分钟前
Unity —— 反射
java·开发语言
初心未改HD8 分钟前
Go Modules:依赖管理的完全指南
开发语言·golang
楼田莉子8 分钟前
仿照Muduo的高并发服务器:EventLoop模块及与TimeWheel模块联调
java·开发语言
Das19 分钟前
通过命令行下载kaggle数据
前端·chrome
小雅痞11 分钟前
[Java][Leetcode middle] 3. 无重复字符的最长子串
java·开发语言·leetcode
逻辑驱动的ken21 分钟前
Java高频面试考点场景题21
java·开发语言·面试·职场和发展·求职招聘