2011-04-05 61 views
0

我們正在嘗試創建一個隨機數生成器來爲虛擬裝配線上的產品創建序列號。 我們得到了要生成的隨機數,但是由於它們是序列號,我們不希望它們產生重複數據。 有沒有辦法可以返回並檢查生成的數字是否已經生成,然後告訴它如果它是重複的以生成新的數字,並且重複此過程直到它具有「獨特「號碼。在jscript中創建隨機數生成器並防止重複

+0

散列每個產品的名稱/ ID /某些特性是不是更容易? – JCOC611 2011-04-05 17:59:24

+0

@ JCOC611 - 散列會相互碰撞,所以它們不是你想要在這裏使用的。確保唯一性的確定性算法就是你想要的。 – tvanfosson 2011-04-05 18:07:15

回答

3

解決此問題的最簡單方法是避免它。使用單調遞增的東西(如時間)來形成序列號的一部分。爲此,您可以添加一些固定值來標識該行或某物。

所以您的序列號格式可以NNNNYYYYMMDDHHMMSS,其中NNNN是一個4位數的行號和YYYY是4位數的年份,MM是兩位數月份,...

如果可以生成多種東西每行每秒,然後添加日期組件,直到您達到每單位時間只有一個可能的時間 - 或者將當天生成的項目計數添加到YYYYMMDD組件(例如,NNNNYYYYMMDDCCCCCC)。

+2

您可以通過使用更高的基數來使其縮短一些數字,例如使用數字0-9A-Z(減ILOQ)的base-32。這將讓你用3個「數字」來編碼年份,每個月份和每天的數字都是1「數字」。 – tvanfosson 2011-04-05 18:13:26

5

序號的要點是它們不是隨機的。串行,由definition,意味着一些東西被安排在一個系列。爲什麼不使用遞增數字?

+0

同意你的意見。 – Linmic 2011-04-05 18:04:41

0

隨着一個真正的隨機數,你將不得不存儲整個集合,並檢查每個數字。很顯然,這意味着你生成的密鑰越慢,越慢(因爲它必須越來越頻繁地重試,並與較大的數據集進行比較)。

這完全是爲什麼真正的隨機數從來沒有用於此目的。對於序列號,標準始終只是做一個連續的數字 - 他們是否有任何真實的隨機數?

唯一ID從不隨機 - GUID等基於系統時間和(最經常)MAC地址。由於使用的算法和機器細節,它們是全球唯一的 - 不是因爲數值的大小或任何隨機性水平。

就我個人而言,我會盡我所能去使用順序值(如果您有多個通道,也許使用唯一的前綴),或者更好地使用真正的GUID來達到您的目的。

0

這是你在找什麼?

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

這對已經接受的答案有什麼改進? – 2012-10-27 20:44:17