专栏首页前端新视界相邻不重复随机数的生成及优化

相邻不重复随机数的生成及优化

生成相邻不重复随机数是之前抽奖插件的遗留问题,在之前的文章中已经简单说过,但没有更好的解决方案。经过一个多月的修改,抽奖插件已经趋于完善,在此分享一下这个问题的解决方法。以下是最初的方法,但是会出现一个单独的全局变量,整体而言稍显多余,不算完美。

// 产生相邻不重复的随机数,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);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Angular Material 的设计之美

    Angular Material 作为 Angular 的官方组件库,无论是设计交互还是易用性都有着极高的质量。正如官方所说其目的就是构建基于 Angular ...

    叙帝利
  • 使用 canvas 画图时图像文字模糊的解决办法

    最近在使用 canvas 画图的时候,遇到了图像文字模糊的问题,解决思路就是根据分辨率绘制不同尺寸的画布。以下是创建高分辨率画布的代码:

    叙帝利
  • 两个 viewports 的故事-第二部分

    原文:A tale of two viewports — part two 译者:nzbin 在这个迷你系列中,我将解释 viewports 和各种重要元素...

    叙帝利
  • 最小二乘法:背后的假设和原理(前篇)

    总结了一些最基本的机器学习概念,比如特征,训练集,维数,假设空间,通过一个例子说明什么是机器学习的泛化能力,再阐述了什么是归纳偏好。是时候开始进一步体会机器学习...

    double
  • 美国人网络安全意识调查:佛州最为糟糕

    网络安全公司Webroot近日联合Ponemon Institute开展的研究调查发现,佛罗里达州是美国境内在网络安全方面做的最差的州。Ponemon对美国境内...

    周俊辉
  • 内网渗透靶机-VulnStack 1

    靶机是红日团队开源的一个靶机,靠着这个环境学习到了很多啊哈哈哈!现在自己也是会搭建一些环境了!也是靠着这个靶机从0开始学内网,了解内网渗透,虽然很菜很菜很菜!靶...

    Gcow安全团队
  • UGL之绘制文本

    首先,参考之前打开显示设备的操作,使用uglRegistryFind()找到字库引擎;然后使用uglFontFindString()找到想要的字体;使用uglF...

    Taishan3721
  • 这些公司在利用人工智能改变网络安全

    美国科技产业与投融资分析公司CB Insights发文介绍了80余家面向网络安全的人工智能公司。 ? 2016年,网络安全公司的融资交易数量创造了记录。2017...

    人工智能快报
  • SPI总线协议及SPI时序图详解【转】

    转自:https://www.cnblogs.com/adylee/p/5399742.html

    用户3033338
  • 全球头号黑客、计算机安全教母,腾讯副总裁如何看待AI时代的安全

    李根 继续发自 国家会议中心 量子位 报道 | 公众号 QbitAI 上次量子位撰文介绍过,AI加持下的安全话题正在升温,仅6月份就有总额30亿元的投资流向安全...

    量子位

扫码关注云+社区

领取腾讯云代金券