Javascript';s Math.random()生成一个将来不会重复的唯一数字?

Javascript';s Math.random()生成一个将来不会重复的唯一数字?,javascript,Javascript,我需要一个随机数,我将在数据库中存储每个记录,而且(生成的随机数)也不应该在将来重复。Math也是如此。random()函数对这一点有好处吗 提前感谢您可以在此处查看用于数据库唯一密钥的GUID生成器。在那里你还可以找到很多关于随机机制的好信息 随机是随机的,从统计学上讲,它将在未来某处重复。您可以做的是将一些独特的东西与随机部分结合起来,例如,使用带有随机数的unix时间戳 function getRand(){ return new Date().getTime().toString

我需要一个随机数,我将在数据库中存储每个记录,而且(生成的随机数)也不应该在将来重复。Math也是如此。random()函数对这一点有好处吗


提前感谢

您可以在此处查看用于数据库唯一密钥的GUID生成器。在那里你还可以找到很多关于随机机制的好信息


随机是随机的,从统计学上讲,它将在未来某处重复。您可以做的是将一些独特的东西与随机部分结合起来,例如,使用带有随机数的unix时间戳

function getRand(){
    return new Date().getTime().toString() + Math.floor(Math.random()*1000000);
}
Math.random()
不会给你一个唯一的数字,通常它甚至不会给你一个真正的随机数


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

时间+增量+随机:

  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的规范,您将看到它被定义为准随机数生成器,这意味着它不是真正的随机数。此外,一个真正的随机数生成器肯定会沿着直线的某个地方重复一个结果,但当这种情况发生时,重复之后的序列将与第一次出现该数字之后的序列不同


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

这是一个随机数,不保证唯一性。也就是说,它是从2^53个值的超集中选择的,它可能不会那么容易地重复一个数字。就像James Donnely添加的:new Date().valueOf()+math.random()不能保证唯一性,但很难重复。这是真的,不确定随机数不会重复,它会,为了让它正常工作,你需要添加一些数字。试一下,直到你不再重复这个数字。然后你就可以继续了。随机是随机的,当然它可能会重复。只链接的答案并不适合SO,如果你链接到SO答案,你应该将问题标记为重复。这不是重复,因为主要问题不是直接关于GUID或其他类似的东西。但我的回答可以展示解决TS问题的另一种方式,可以为他和其他读者带来很多相关信息。这是一个X-Y问题。即使不是这样,仅链接的答案仍然不正确。从统计上看,它可能不会重复,但显然这还不够好,不适合在将来的某个地方使用uid。@DaveNewton。。我认为无限时间尺度上的任何非零概率都收敛到100%(或者如果我们使用极限,则为100%)。关键是,仅使用随机数生成UID是不安全的。将它与unix时间戳相结合,可以显著降低生成重复ID的机会-它必须同时生成,并实际生成相同的附加随机数..我的观点是,它在OPs系统的生命周期内不太可能重复,我明确指出,这对于uid生成来说是不够的。在一个真实的系统中没有无限的时间尺度,但我同意这不应该是偶然的。