0

0

如何生成一个包含 1 到 12 的无重复随机排列数组

聖光之護

聖光之護

发布时间:2026-03-08 14:48:11

|

688人浏览过

|

来源于php中文网

原创

如何生成一个包含 1 到 12 的无重复随机排列数组

本文详解如何高效、可靠地生成指定范围内的无重复随机数数组(即随机排列),并指出常见误区(如低效的 while 循环去重),推荐使用 fisher-yates 洗牌思想的现代简洁实现。

本文详解如何高效、可靠地生成指定范围内的无重复随机数数组(即随机排列),并指出常见误区(如低效的 while 循环去重),推荐使用 fisher-yates 洗牌思想的现代简洁实现。

在前端开发或算法练习中,经常需要将一组连续整数(如 1–12)随机打乱顺序,形成一个无重复、等概率分布的随机排列数组——这本质上是「数组洗牌」(shuffling)问题,而非简单地多次调用 Math.random() 并手动去重。

你原始代码中的 getRandomArray 函数虽能工作,但存在明显缺陷:

  • 使用 indexOf 在循环中反复查找,时间复杂度最坏达 O(n²),当 count 接近 max−min+1(如本例中 12 选 12)时,后期命中未使用数字的概率急剧下降,导致大量无效循环;
  • 未处理边界异常(如 count > range 仅返回 undefined,易引发后续错误);
  • 返回值被错误地包裹成二维数组:[getRandomArray(1, 12, 12)] 会产生类似 [[3,7,1,12,...]] 的结构,导致 contentNumber[0] 是整个数组而非单个数字,因此 addClass(contentNumber[0]) 实际传入的是数组对象(转为字符串 "3,7,1,12..."),而非预期的类名 "3"。

✅ 正确解法应基于洗牌算法(推荐 ES6 简洁实现,本质是随机排序):

SekoTalk
SekoTalk

商汤科技推出的AI对口型视频创作工具

下载
// 生成 1~12 的随机排列(无重复、均匀分布)
const shuffled = Array.from({ length: 12 }, (_, i) => i + 1)
  .sort(() => Math.random() - 0.5);

console.log(shuffled); // e.g. [8, 2, 11, 1, 9, 4, 12, 5, 7, 3, 10, 6]

⚠️ 注意:sort(() => Math.random() - 0.5) 虽简洁,但并非严格均匀(V8 引擎下存在轻微偏差),生产环境推荐更鲁棒的 Fisher-Yates(Knuth Shuffle)原地算法

function shuffleArray(arr) {
  const copy = [...arr]; // 避免修改原数组
  for (let i = copy.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [copy[i], copy[j]] = [copy[j], copy[i]]; // 解构交换
  }
  return copy;
}

const numbers = Array.from({ length: 12 }, (_, i) => i + 1);
const contentNumber = shuffleArray(numbers);

// 正确应用到 jQuery 元素(注意:去掉外层数组括号!)
$content.eq(0).addClass(contentNumber[0]);
$content.eq(1).addClass(contentNumber[1]);
// ... 或更优雅地遍历:
contentNumber.forEach((num, index) => {
  $content.eq(index).addClass(`item-${num}`);
});

? 关键总结:

  • ✅ Array.from({length: n}, (_, i) => i + 1) 是生成连续整数数组的现代标准写法;
  • ✅ 洗牌必须作用于「已知全集」,而非“边生成边去重”,效率与正确性兼得;
  • ✅ 类名赋值时,确保 contentNumber 是一维数组(如 [5, 2, 11, ...]),而非 [[5, 2, 11, ...]];
  • ✅ 若需语义化类名(如 item-5),建议拼接前缀,避免纯数字类名在 CSS 中引发解析歧义。

掌握这一模式后,可轻松扩展至任意范围(如 shuffleRange(10, 20, 11))或任意类型元素的随机排序。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

231

2025.12.24

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

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

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

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

44

2026.03.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号