Javascript 的 Math.random() 是否生成了一个将来不再重复的唯一数字?



我需要一个随机数,我将每条记录存储在数据库中,并且(生成的随机数)将来也不应该重复。那么 Math.random() 函数对此有好处吗?

提前致谢

随机是随机的,从统计上讲,它将在将来的某个地方重复。您可以做的是将独特的内容与随机部分相结合 - 例如,将 unix 时间戳与随机数一起使用。

function getRand(){
    return new Date().getTime().toString() + Math.floor(Math.random()*1000000);
}

Math.random()不会给你一个唯一的数字,一般来说,它甚至不会给你一个真正的随机数。

您可以尝试使用基于日期时间的随机算法,或者使用随机数,然后检查它是否已在您的数据库中,但这两种方法都不是 100% 保存的。几乎只有一种方法可以确保您存储的数字是唯一的,即在数据库级别。

您可以在此处查看 GUID 生成器,了解数据库的唯一键。此外,您还可以找到很多有关随机机制的好信息

在 JavaScript 中创建 GUID/UUID?

时间 +

增量 + 随机:

  var newGuid = (function() {
    var guid = parseInt(Math.random() * 36);
    return function newGuid() {
      return Date.now().toString(36) + (guid++ % 36).toString(36) + Math.random().toString(36).slice(2, 4);
    };
  })();

如果你看一下math.random的规格,你会发现它被定义为准随机数生成器,这意味着它并不是真正的随机。此外,真正的随机数生成器肯定会沿线的某个地方重复结果,但是,当这种情况发生时,此重复之后的序列将不类似于数字第一次出现后的序列。

现在,您提到需要将其存储在数据库中。为什么不使用 SEQUENCE(在 Oracle 中;其他 DBMS 对此有不同的机制)?这将保证任何使用的号码永远不会被重复使用。此外,如果您不想在序列中使用数字,则可以使用此序列的值作为随机数(或哈希)的种子。这将为您提供相当多数字的唯一性。

最新更新