zoukankan      html  css  js  c++  java
  • 相邻不重复随机数的生成及优化

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

    // 产生相邻不重复的随机数,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);
  • 相关阅读:
    小程序-文章:微信小程序常见的UI框架/组件库总结
    小程序-文章:微信第三方登录(静默授权和非静默授权)
    asterisk
    Java实现 洛谷 P1423 小玉在游泳
    Java实现 洛谷 P1423 小玉在游泳
    Java实现 洛谷 P1423 小玉在游泳
    Java实现 洛谷 P1035 级数求和
    Java实现 洛谷 P1035 级数求和
    Java实现 洛谷 P1035 级数求和
    Java实现 洛谷 P1035 级数求和
  • 原文地址:https://www.cnblogs.com/nzbin/p/6358962.html
Copyright © 2011-2022 走看看