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

Javascript 在jscript中创建随机数生成器并防止重复,javascript,Javascript,我们正在尝试创建一个随机数生成器,为虚拟装配线上的产品创建序列号。 我们得到了要生成的随机数,但是因为它们是序列号,所以我们不希望它产生重复。 有没有一种方法可以让它返回并检查生成的数字是否已经生成,然后告诉它如果是重复的,则生成一个新的数字,并重复此过程,直到它有一个唯一的数字。序列号的意义在于它们不是随机的。连环的意思是把某物排列成一系列。为什么不使用递增的数字?解决此问题的最简单方法是避免它。使用像时间一样单调递增的东西来形成序列号的一部分。为此,您可以预先添加一些固定值来标识行或其他内容

我们正在尝试创建一个随机数生成器,为虚拟装配线上的产品创建序列号。 我们得到了要生成的随机数,但是因为它们是序列号,所以我们不希望它产生重复。
有没有一种方法可以让它返回并检查生成的数字是否已经生成,然后告诉它如果是重复的,则生成一个新的数字,并重复此过程,直到它有一个唯一的数字。

序列号的意义在于它们不是随机的。连环的意思是把某物排列成一系列。为什么不使用递增的数字?

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

因此,您的序列号格式可以是nnnnyyymmddhhmmss,其中NNNN是4位行号,yyy是4位年份,MM是2位月份


如果每行每秒可以生成多个项目,则添加日期组件,直到达到每单位时间只能生成一个项目为止,或者只需将当天生成的项目数添加到YYYYMMDD组件中,例如。,nnnnyyyyymmddcccccc.

对于一个真正的随机数,您必须存储整个集合,并针对每个数字进行检查。显然,这意味着生成的密钥数量越大,生成的速度就会越来越慢,因为与更大的数据集相比,生成的密钥必须越来越频繁地重试

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

唯一ID从来不是随机的-GUID等基于系统时间和最常见的MAC地址。它们是全局唯一的,这是因为所使用的算法和机器的特殊性,而不是因为值的大小或任何程度的随机性


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

这就是您要找的吗

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;
}

散列每个产品的名称/id/something特征不是更容易吗?@JCOC611-散列会发生冲突,因此它们不是您想要在这里使用的。你想要的是一个具有保证唯一性的确定性算法。你可以通过对一些数字使用更高的基数来缩短它,比如使用0-9A-Z减去ILOQ的基数-32。这将让你用3位数字编码年份,月和日用1位数字编码。