首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >相邻不重复随机数的生成及优化

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

作者头像
叙帝利
发布2018-01-17 15:57:04
1.7K0
发布2018-01-17 15:57:04
举报

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

// 产生相邻不重复的随机数,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);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-01-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档