Javascript's Math.random()会生成一个唯一的号码,以后不会重复吗?

Javascript's Math.random()会生成一个唯一的号码,以后不会重复吗?

问题描述:

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

在此先感谢

+0

http://stackoverflow.com/questions/8012002/create-a-unique-number-with-javascript-time –

+0

这是一个随机数,没有承诺的唯一性。也就是说,它从2^53值的超集中选择,它可能不会轻易重复一个数字。 – gurvinder372

+0

Like James Donnely补充说: new Date()。valueOf()+ math.random()不保证唯一性,但很难重复 – Borjante

你可以在这里看到GUID发电机为你的数据库的唯一键。也有,你可以找到很多好的信息,关于随机机制

Create GUID/UUID in JavaScript?

+0

只有链接的答案不太适合,如果你链接到一个SO答案,你应该将问题标记为一个骗局。 –

+0

这不是愚蠢的,因为主要问题不是直接关于GUID或其他事情。但是我的回答可以显示解决TS问题的另一种方式,并且可以为他和其他读者带来大量相关信息。 – Vitalii

+0

这是一个X-Y问题。即使不是,链接专用答案仍然不行。 –

随机是随机的,它统计将在未来的某个地方重复。你可以做的是把一些独特的东西和一个随机部分结合起来 - 例如使用unix时间戳和一个随机数字

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

那么,*统计*它可能*不会*重复,但显然这不够好的一个用户。 –

+0

@DaveNewton *未来某处* ..我认为无限时间范围内的任何非零机会收敛到100%(或者如果我们使用限制,则只是100%)。关键是仅使用随机数来生成UID是不安全的。将它与unix时间戳相结合可以显着减少生成重复ID的机会 - 它必须同时生成并实际生成相同的附加随机数。 – Dropout

+0

我的观点是,它在生命周期中不可能重复的OP系统,我明确表示这不是一个足够的生成过程。在真实的系统中没有无限的时间尺度这样的事情 - 但我同意不应该偶然地完成。 –

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

您可以尝试使用基于日期时间的随机algorythm,或去随机数,然后检查它是否已经在您的数据库中,但这两种方法都不是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的规格,你会看到,被定义为拟随机数生成器,这意味着,它是不是真的随机的。此外,一个真正的随机数发生器肯定会重复沿着线BUT的某个地方的结果,当发生这种情况时,跟随这个重复的序列将不会与数字首次出现后的序列相似。

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