如何根据长度和字符查找总可能的值?

时间:2015-11-18 23:35:45

标签: javascript jquery math extend dynamically-generated

我在这里完全不是一个数学专家,但是在StackOverflow的帮助下(以及大量的试验和错误)汇总了一个函数,它从Formula生成随机序列号,Letters/Numbersarray组(以便不重复值)。

所以,我目前的公式如下:

$.extend({
    generateSerial: function(formula, chrs, checks) {
        var formula = formula && formula != "" ? formula : 'XXX-XXX-XXX-XXX-XXX', // 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/g) || []).length,
            indices = [],
            rand;

        // Get all "-" char indexes
        for(var i=0; i < formula.length; i++) {
            if (formula[i] === "-") indices.push(i);
        }

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

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

        return rand;
    }
});

好的,所以,我需要做的是找到可能的总值,并确保在实际执行之前可以生成唯一的序列号。

例如:

var num = $.generateSerial('XX', 'AB', new Array('AB', 'BA', 'AA', 'BB'));

这将导致代码执行无限循环,因为除了从扩展中排除的那些之外,这里没有其他可能性。所以这会导致浏览器崩溃。我需要在这里做的是能够在这里得到可能的唯一值的数量,如果它大于0,继续,否则,不要继续,可能警告错误将是好的

另外,请记住,也可以在循环中执行此操作,以便不重复已生成的序列号:

var currSerials = [];
for (var x = 0; x < 5; x++)
{
     var output = $.generateSerial('XXX-XXX-XXX', '0123456789', currSerials);
     currSerials.push(output);
}

但重要的是,如何从generateSerial函数本身中获取总可能的唯一值?我们在这里也有长度,字符和排除数组(checks)。这似乎更像是一个数学问题,而且我不是数学方面的专家。可以在这里使用一些帮助。

谢谢你们:)

这是一个很好的jsFiddle工作,因为有更多可能的选择而不是16:http://jsfiddle.net/qpw66bwb/1/

这是我面临的问题的一个问题:只需点击&#34;生成序列&#34;按钮来查看问题(它会不断循环,永不完成),它想要创建16个连续剧,但是有两个字符甚至不能使用A和B字符进行16种可能的选择:http://jsfiddle.net/qpw66bwb/2/

我需要在这里捕获循环并退出它,如果它无法以某种方式生成随机数。但是如何?

1 个答案:

答案 0 :(得分:1)

假设len * chrs.length中的所有字符都不同,可能的序列号的数量为chrs。该序列包含随机填写的len个字符,chrs.length是每个位置中可能的字符数。