相邻不重复随机数的生成及优化
时间:2022-04-22
本文章向大家介绍相邻不重复随机数的生成及优化,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
生成相邻不重复随机数是之前抽奖插件的遗留问题,在之前的文章中已经简单说过,但没有更好的解决方案。经过一个多月的修改,抽奖插件已经趋于完善,在此分享一下这个问题的解决方法。以下是最初的方法,但是会出现一个单独的全局变量,整体而言稍显多余,不算完美。
// 产生相邻不重复的随机数,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);
- [Silverlight动画]转向行为 - 机车
- 微信、小游戏与未来
- [Silverlight动画]转向行为 - 2D向量
- [Silverlight动画]转向行为 - 介绍
- WCF技术剖析之十七:消息(Message)详解(中篇)
- flash游戏引擎整理
- [Silverlight动画]转向行为 - 群落
- [Silverlight动画]转向行为 - 路径跟随
- [Silverlight动画]转向行为 - 漫游行为
- [Silverlight动画]转向行为 - 对象回避
- [mobile开发碎碎念]手机页面上显示PDF文件
- Windows Server 2008 R2 配置AD(Active Directory)域控制器
- ios开发基础知识 - 2
- ios开发基础知识 - 1
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Rust FFI 编程 - bindgen 使用示例
- bug 回忆录(三)
- bug 回忆录(二)
- bug 回忆录(一)
- 曾经绊倒我的 “超级丑数”
- Flutter 完成全平台制霸:实现 Windows 应用支持
- 尤大 4 天前发在 GitHub 上的 vue-lit 是啥?
- 原创的20个Python自动化案例,一口一个,高效办公!
- 看完这篇Python操作PPT总结,从此使用Python玩转Office全家桶就没有压力了!
- 【Hadoop 分布式部署 三:基于Hadoop 2.x 伪分布式部署进行修改配置文件】
- DCL单例模式你不知道的秘密
- 《大话数据结构》队列的顺序存储和链式存储
- 《大话数据结构》栈的顺序存储及链式存储
- 《大话数据结构》之双向链表
- 《大话数据结构》线性表的链式存储结构