如何从长度和字符中找到总可能值?
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
是其中每个位置可能出现的字符数。
我在这里完全不是数学神童,但在 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
是其中每个位置可能出现的字符数。