【问题标题】:Built jQuery extension, but not allowing max return values内置 jQuery 扩展,但不允许最大返回值
【发布时间】:2016-07-31 07:16:30
【问题描述】:

我在这里整理了一个问题的 jsfiddle:https://jsfiddle.net/sd1x3am3/5/

基本上,我构建了一个名为$.generateSerial 的扩展,它接受3 个参数。第一个参数是公式,第二个是允许的字符,第三个是不包含在返回值中的序列。基本上,该扩展允许您生成一个唯一的随机序列,该序列不是第三个参数中的序列,并且每次在 $.generateSerial 中调用 for 时,在 output 变量中返回的序列都没有循环。

由于某种原因,$.generateSeriali = 146 时在循环内返回"",但它应该返回更多的值,所以它不应该返回""

公式为XXXX-XXXX-XXXX-XXXX,允许的字符为:ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,这意味着这些字符中的任何一个都可以替换formula 中的任何X 字符。但是应该返回超过 145/146 个结果,这还不包括 currSerials 数组中的内容。应该有更多可以生成的连续剧。

但我不明白为什么它没有生成所有可能的连续剧并停止......

$.extend({
    generateSerial: function(formula, chrs, checks) {
        var formula = formula && formula != "" ? formula : 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX', // Default Formula to use, should change to what's most commonly used!
            chrs = chrs && chrs != "" ? chrs : "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", // Default characters to randomize, if not defined!
            len = (formula.match(/X/ig) || []).length,
            oStatic = formula.match(/[^X]+/ig) || [],
            indices = [],
            lenChecks = checks.length || 0,
            rand;

        // Let's first find out if it's possible to create another random serial from params
        // Should put the formula below through a stress test here to be sure it works!
        var possible = (len * chrs.length) - lenChecks;

        // return empty string if not possible!
        if (possible <= 0)
            return '';

        var currIndex = 0;

        // Getting all indices here of all strings that are not X or x
        for (var o = 0; o < oStatic.length; o++) {
            currIndex = formula.indexOf(oStatic[o], currIndex);
            indices.push(currIndex);
            currIndex = currIndex + oStatic[o].length; // set the position to start at for next loop! incrementing...
        }

        do {
            rand = Array(len).join().split(',').map(function() {
                return chrs.charAt(Math.floor(Math.random() * chrs.length));
            }).join('');

            // Rebuild with indices, if exists!
            if (indices && indices.length > 0) {
                for (var x = 0; x < indices.length; x++)
                    rand = rand.insert(indices[x], oStatic[x]);
            }
        } while (checks && $.inArray(rand, checks) !== -1);

        return rand;
    }
});

谁能帮我解决这个问题?我的 possible 扩展中的变量可能有问题吗?不正确吗?

甚至在没有currSerials 数组的情况下尝试过它,它最初是空的,并且在它说它不能再生成之前只生成 576 个序列。你可以在这里看到它:https://jsfiddle.net/sd1x3am3/8/

var currSerials = [];
for (var i = 0; i < 2000; i++) {
    var output = $.generateSerial('XXXX-XXXX-XXXX-XXXX', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', currSerials);

    $(".serials").append($("<p />").text((i+1) + '. ' + output));
    if (output != "")
        currSerials.push(output);
    else
    {
        alert('Can not generate anymore serials, stopped at ' + i + '.');
        break;
    }
}

【问题讨论】:

  • 如果我删除了可能的检查,它似乎可以工作,但老实说,我需要知道是否可以使用在开始之前给出的公式和字符和检查数组创建另一个唯一的随机序列号do...while... 循环。为什么possible 没有返回正确数量的可能序列号?

标签: javascript jquery arrays random extend


【解决方案1】:

从讨论中,我发现你不是在排列之后,所以你应该使用以下找到total possible items

var possible=Math.pow(chrs.length,len) - lenChecks

【讨论】:

  • 好的,那为什么这不会提醒我任何事情:jsfiddle.net/sd1x3am3/9 我应该在这里提醒您无法再生成连续剧,但我什么也没得到。实际上我得到了错误:Uncaught RangeError: Maximum call stack size exceeded
  • 置换时,字符总数应大于占位符,否则chrs.length-len会遇到负数,阶乘会无限循环。
  • 我正在使用$.generateSerial('XX-XX', 'AB', currSerials);,它应该知道在耗尽所有可能的串行组合后,它应该返回'',但它没有。
  • 那么,当公式长度小于总字符数时,没有办法解释吗?这里不能有无限循环。
  • x==0 更改为 x&lt;=0 in factorial 和 possible 现在为您提供全局可能的项目总数`。从生成的项目计数中减去它以了解它是否可以生成新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2018-04-02
  • 2021-04-08
  • 2020-04-10
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多