如何从长度和字符中找到总可能值?

How to find total possible values from length and characters?

我在这里完全不是数学神童,但在 Whosebug 的大力帮助下(以及大量的试验和错误),我将一个函数放在一起,该函数从 Formula 生成随机序列号,一组 Letters/Numbers,和 array(以免重复值)。

所以,我现在的公式如下:

$.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/

这是我面临的问题的 jsFiddle:只需单击 "Generate Serials" 按钮即可查看问题(它不断循环,永远不会结束),它想要创建 16 个连续剧,但有 16 个可能的选择甚至不可能使用 2 个字符并且仅使用 A 和 B 字符:http://jsfiddle.net/qpw66bwb/2/

如果它无法以某种方式生成随机数,我需要在此处捕获循环并退出它。但是怎么办?

可能的连载数是len * chrs.length,假设chrs中的所有字符都不同。连载有len个字符随机填写,chrs.length是其中每个位置可能出现的字符数。