我在这里完全不是一个数学专家,但是在StackOverflow的帮助下(以及大量的试验和错误)汇总了一个函数,它从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/
这是我面临的问题的一个问题:只需点击&#34;生成序列&#34;按钮来查看问题(它会不断循环,永不完成),它想要创建16个连续剧,但是有两个字符甚至不能使用A和B字符进行16种可能的选择:http://jsfiddle.net/qpw66bwb/2/
我需要在这里捕获循环并退出它,如果它无法以某种方式生成随机数。但是如何?
答案 0 :(得分:1)
假设len * chrs.length
中的所有字符都不同,可能的序列号的数量为chrs
。该序列包含随机填写的len
个字符,chrs.length
是每个位置中可能的字符数。