在jscript中创建一个随机数生成器并防止重复

时间:2011-04-05 17:56:36

标签: javascript

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

4 个答案:

答案 0 :(得分:5)

序列号的要点是它们不是随机的。序列号definition表示某些内容按顺序排列。为什么不使用递增数字?

答案 1 :(得分:3)

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

因此您的序列号格式可能是NNNNYYYYMMDDHHMMSS,其中NNNN是4位数的行号,YYYY是4位数年份,MM是2位数月份,...

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

答案 2 :(得分:0)

使用真正随机的数字,您必须存储整个集合并查看每个数字。显然,这意味着你生成的密钥数量越大,你的生成就会变得越来越慢(因为它必须越来越频繁地重试并与更大的数据集进行比较)。

这就是为什么真正的随机数从未用于此目的的原因。对于序列号,标准总是只做一个序号 - 它们是否真的是随机的?

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

就我个人而言,我会尽我所能使用顺序值(如果你有多个频道,可能会使用唯一的前缀),或者更好的是,为你的目的使用真正的GUID。

答案 3 :(得分: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;
}