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

相关推荐
开开心心就好2 分钟前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
爱喝白开水a6 分钟前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
Never_Satisfied6 分钟前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌416 分钟前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
3GPP仿真实验室29 分钟前
【Matlab源码】6G候选波形:OFDM-IM 增强仿真平台 DM、CI
开发语言·matlab·ci/cd
devmoon33 分钟前
在 Polkadot 上部署独立区块链Paseo 测试网实战部署指南
开发语言·安全·区块链·polkadot·erc-20·测试网·独立链
lili-felicity33 分钟前
CANN流水线并行推理与资源调度优化
开发语言·人工智能
沐知全栈开发34 分钟前
CSS3 边框:全面解析与实战技巧
开发语言
island131444 分钟前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构 Stream 调度机制
c语言·开发语言·神经网络
曹牧1 小时前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言