2011-04-05 76 views
0

我们正在尝试创建一个随机数生成器来为虚拟装配线上的产品创建序列号。 我们得到了要生成的随机数,但是由于它们是序列号,我们不希望它们产生重复数据。 有没有办法可以返回并检查生成的数字是否已经生成,然后告诉它如果它是重复的以生成新的数字,并且重复此过程直到它具有“独特“号码。在jscript中创建随机数生成器并防止重复

+0

散列每个产品的名称/ ID /某些特性是不是更容易? – JCOC611 2011-04-05 17:59:24

+0

@ JCOC611 - 散列会相互碰撞,所以它们不是你想要在这里使用的。确保唯一性的确定性算法就是你想要的。 – tvanfosson 2011-04-05 18:07:15

回答

3

解决此问题的最简单方法是避免它。使用单调递增的东西(如时间)来形成序列号的一部分。为此,您可以添加一些固定值来标识该行或某物。

所以您的序列号格式可以NNNNYYYYMMDDHHMMSS,其中NNNN是一个4位数的行号和YYYY是4位数的年份,MM是两位数月份,...

如果可以生成多种东西每行每秒,然后添加日期组件,直到您达到每单位时间只有一个可能的时间 - 或者将当天生成的项目计数添加到YYYYMMDD组件(例如,NNNNYYYYMMDDCCCCCC)。

+2

您可以通过使用更高的基数来使其缩短一些数字,例如使用数字0-9A-Z(减ILOQ)的base-32。这将让你用3个“数字”来编码年份,每个月份和每天的数字都是1“数字”。 – tvanfosson 2011-04-05 18:13:26

5

序号的要点是它们不是随机的。串行,由definition,意味着一些东西被安排在一个系列。为什么不使用递增数字?

+0

同意你的意见。 – Linmic 2011-04-05 18:04:41

0

随着一个真正的随机数,你将不得不存储整个集合,并检查每个数字。很显然,这意味着你生成的密钥越慢,越慢(因为它必须越来越频繁地重试,并与较大的数据集进行比较)。

这完全是为什么真正的随机数从来没有用于此目的。对于序列号,标准始终只是做一个连续的数字 - 他们是否有任何真实的随机数?

唯一ID从不随机 - GUID等基于系统时间和(最经常)MAC地址。由于使用的算法和机器细节,它们是全球唯一的 - 不是因为数值的大小或任何随机性水平。

就我个人而言,我会尽我所能去使用顺序值(如果您有多个通道,也许使用唯一的前缀),或者更好地使用真正的GUID来达到您的目的。

0

这是你在找什么?

var rArray; 

function fillArray (range) 
{ 
    rArray = new Array(); 

    for(var x = 0; x < range; x++) 
    rArray [x] = x; 
} 

function randomND (range) 
{ 
    if (rArray == null || rArray.length < 1) 
    fillArray (range); 

    var pos = Math.floor(Math.random()*rArray.length); 
    var ran = rArray [pos]; 

    for(var x = pos; x < rArray.length; x++) 
    rArray [x] = rArray [x+1]; 

    var tempArray = new Array (rArray.length-1) 
    for(var x = 0; x < tempArray.length; x++) 
    tempArray [x] = rArray [x]; 

    rArray = tempArray; 

    return ran; 
} 
+0

这对已经接受的答案有什么改进? – 2012-10-27 20:44:17