相邻不重复随机数的生成及优化
生成相邻不重复随机数是之前抽奖插件的遗留问题,在之前的文章中已经简单说过,但没有更好的解决方案。经过一个多月的修改,抽奖插件已经趋于完善,在此分享一下这个问题的解决方法。以下是最初的方法,但是会出现一个单独的全局变量,整体而言稍显多余,不算完美。
// 产生相邻不重复的随机数,n 为随机数个数 var b = 0; function random(n) {
var a = Math.floor(Math.random() * n); if (a == b) { return random(n); } else { b = a; return b; } };
为了避免多余的全局变量,需要使用立即执行函数以及闭包的方法。这个问题不难,但对于初学者来说,这个问题却很值得深思。有利于深入理解 JS 的相关概念。代码如下
// 产生相邻不重复的随机数,n 为随机数个数
var random = function(){ var b = 0; return function (n) {
var a = Math.floor(Math.random() * n); if (a == b) { return random(n); } else { b = a; return b; } }
}();
对于修改后的代码,虽然代码不多,变化不大,但我仍然有很多不懂的问题,比如函数参数放在哪里合适,返回的函数是否必须是匿名函数等等。整体而言,我仍然感觉这不是一个太好的解决方法。经过一些尝试及思考,所谓对比变量就是产生的抽奖号,最终把随机函数封装在了构造函数的原型方法中。这样看来,终于去除了零散多余的函数及变量,也是我最初希望实现的效果。
;(function(window, $) { // 插件主体 $.plugin = function(el, options) { } // 默认配置 $.plugin.defaults = { } // 原型方法 $.plugin.prototype = { ...... // 产生相邻不重复的随机数,n 为随机数个数 random: function(n) { var self = this; var rand = Math.floor(Math.random() * n); if (rand == self.luckyNum) { return self.random(n); } else { self.luckyNum = rand; return self.luckyNum; } }, ...... } // 设置 jQuery 插件 $.fn.plugin = function(options) { return instance; }
})(window, jQuery);
感谢您的阅读,如果您对我的文章感兴趣,可以关注我的博客,我是叙帝利,下篇文章再见!
低代码平台必备轻量级 GUI 库 https://github.com/acrodata/gui
适用于 Angular 的 CodeMirror 6 组件 https://github.com/acrodata/code-editor
适用于 Angular 的水印组件(防删除,盲水印) https://github.com/acrodata/watermark
开发低代码平台的必备拖拽库 https://github.com/ng-dnd/ng-dnd
基于 Angular Material 的中后台管理框架 https://github.com/ng-matero/ng-matero
Angular Material Extensions 扩展组件库 https://github.com/ng-matero/extensions
Unslider 轮播图插件纯 JS 实现 https://github.com/nzbin/unsliderjs
仿 Windows 照片查看器插件 https://github.com/nzbin/photoviewer
仿 Windows 照片查看器插件 jQuery 版 https://github.com/nzbin/magnify
完美替代 jQuery 的模块化 DOM 库 https://github.com/nzbin/domq
简化类名的轻量级 CSS 框架 https://github.com/nzbin/snack
与任意 UI 框架搭配使用的通用辅助类 https://github.com/nzbin/snack-helper
单元素纯 CSS 加载动画 https://github.com/nzbin/three-dots
有趣的 jQuery 卡片抽奖插件 https://github.com/nzbin/CardShow
悬疑科幻电影推荐 https://github.com/nzbin/movie-gallery
锻炼记忆力的小程序 https://github.com/nzbin/memory-stake