0

0

如何生成不重复的随机排列数组(1–12 的洗牌序列)

霞舞

霞舞

发布时间:2026-03-08 14:16:13

|

647人浏览过

|

来源于php中文网

原创

如何生成不重复的随机排列数组(1–12 的洗牌序列)

本文详解如何在 javascript 中高效生成指定范围、指定长度且无重复的随机排列数组(即“洗牌”),替代低效的 while 循环重试法,并提供可直接运行的现代语法实现与关键注意事项。

本文详解如何在 javascript 中高效生成指定范围、指定长度且无重复的随机排列数组(即“洗牌”),替代低效的 while 循环重试法,并提供可直接运行的现代语法实现与关键注意事项。

在前端开发或算法练习中,常需将一组连续整数(如 1 到 12)随机打乱顺序,形成一个无重复、全覆盖的排列数组——这本质上是经典的「Fisher–Yates 洗牌」问题。你当前使用的 getRandomArray 函数虽能达成目标,但存在明显缺陷:它依赖 indexOf 检查重复 + while(true) 循环重试,在极端情况下(尤其当 count 接近 max-min+1 时)可能产生大量无效尝试,时间复杂度不可控(最坏趋近于无限),且代码可读性与性能均不理想。

更优解是采用 “生成后洗牌”策略:先创建有序数组 [1, 2, ..., 12],再通过随机排序(shuffling)打乱其顺序。JavaScript 中最简洁、可靠的方式是利用 Array.from() 配合 sort():

// ✅ 推荐:生成 1–12 的随机排列(无重复、全覆盖)
const shuffled = Array
  .from({ length: 12 }, (_, i) => i + 1) // → [1, 2, 3, ..., 12]
  .sort(() => Math.random() - 0.5);       // 基于随机因子原地洗牌

console.log(shuffled);
// 示例输出:[7, 2, 11, 4, 9, 1, 12, 5, 8, 3, 10, 6]

⚠️ 注意:sort(() => Math.random() - 0.5) 是一种简洁的近似洗牌,适用于教学和一般场景;但严格来说,它并非均匀分布(某些排列概率略高)。如需密码学级或统计学严谨的洗牌,请使用 Fisher–Yates 算法(原地交换,O(n) 时间、真正均匀):

// ✅ 进阶:Fisher–Yates 洗牌(推荐用于生产环境)
function shuffle(array) {
  const arr = [...array]; // 创建副本,避免修改原数组
  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]]; // ES6 解构交换
  }
  return arr;
}

const numbers = Array.from({ length: 12 }, (_, i) => i + 1);
const result = shuffle(numbers);
console.log(result);

回到你的实际用例:为 12 个 DOM 元素动态添加对应随机类名(如 content-7, content-2),可直接结合洗牌结果操作:

const $content = $('.content'); // 假设你使用 jQuery
const shuffledIds = shuffle(Array.from({ length: 12 }, (_, i) => i + 1));

shuffledIds.forEach((id, index) => {
  $content.eq(index).addClass(`content-${id}`);
});
// 此时每个元素获得唯一、随机的类名,如:<div class="content-7">...</div>

关键总结

  • ❌ 避免 while + indexOf 的重复检查方案——效率低、逻辑脆弱;
  • ✅ 优先使用 Array.from + sort 快速实现(学习/原型阶段);
  • ✅ 生产环境建议封装 Fisher–Yates 洗牌函数,保障随机性质量;
  • ✅ 所有方案均返回标准 JavaScript 数组,可直接索引(arr[0])、遍历(forEach)或解构,完全满足 .addClass(contentNumber[i]) 等 DOM 操作需求。

从此,你的“随机编号”不再是杂乱数字流,而是一个结构清晰、行为可预测、性能可靠的数组对象。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

409

2023.09.04

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

105

2023.09.25

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

225

2025.12.04

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4249

2024.08.14

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

490

2023.08.14

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

46

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

117

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

231

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 20.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号