【问题标题】:Creating a random number generator in jscript and prevent duplicates在 jscript 中创建随机数生成器并防止重复
【发布时间】:2011-04-05 17:56:35
【问题描述】:

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

【问题讨论】:

  • 散列每个产品的名称/ID/某物特征不是更容易吗?
  • @JCOC611 - 哈希值会发生冲突,所以它们不是你想在这里使用的。您想要的是具有保证唯一性的确定性算法。

标签: javascript


【解决方案1】:

序列号的意义在于它们不是随机的。串行,definition 表示,某些东西是按系列排列的。为什么不直接使用递增的数字?

【讨论】:

    【解决方案2】:

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

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

    如果您可以在每行每秒生产多件物品,则添加日期组件,直到达到每单位时间只能生产一件物品的地步——或者简单地将当天生产的物品数量添加到 YYYYMMDD 组件中(例如, NNNNYYYYMMDDCCCCCC)。

    【讨论】:

    • 您可以通过为某些数字使用更高的基数来缩短它,例如使用数字 0-9A-Z(减去 ILOQ)的 base-32。这将让您将年份编码为 3 个“数字”,将月份和日期分别编码为 1 个“数字”。
    【解决方案3】:

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

    这就是为什么真正的随机数永远不会用于此目的的原因。对于序列号,标准总是只做一个序列号——它们是随机的吗?

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

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

    【讨论】:

      【解决方案4】:

      这就是你要找的吗?

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

      【讨论】:

        猜你喜欢
        • 2014-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        • 2022-01-07
        • 2017-05-20
        • 2023-03-12
        • 2013-06-28
        • 2011-11-24
        相关资源
        最近更新 更多