2012-04-06 67 views
2

我想要在循環中使用 javascript生成至少1000個唯一的隨機數,並使用10位數字。這可能嗎?或者JavaScript是一個錯誤的事情呢?在循環中使用javascript生成1000個隨機10位數字

UPDATE:您將如何確保不會創建重複項?

+1

是的,這是可能的JavaScript。 – 2012-04-06 11:33:41

+1

是的,這是可能的。你想要做這個提示嗎? – RobG 2012-04-06 11:33:43

回答

3

這是我會怎麼做:

var arr = [], 
    track = [], 
    min = 1000000000, 
    max = 9999999999, 
    qty = 1000, 
    ii = 0, 
    rnd; 

while (ii < qty) { 
    rnd = Math.floor(Math.random() * (max - min + 1)) + min; 
    if (!track[rnd]) { 
     arr[ii] = track[rnd] = rnd; 
     ii += 1; 
    } 
} 

這裏的工作的例子:現在http://jsfiddle.net/mTmEs/

,如果出事歪用Math.random,由於某種原因它會產生很多重複,這段代碼可能需要很長時間才能完成TE。儘管當你談論大量獨特的隨機數時,我認爲沒有辦法解決這種潛在的問題。

+1

我會改變軌道到一個對象,現在軌道是一個AWFUL很多元素的數組。使用對象會更快。 – Creynders 2012-04-06 12:14:48

+1

我在測試中的方法需要8-9毫秒,使用一個帶有循環的數組來檢查重複數據需要40-50毫秒,並且使用一個對象並從中恢復一個10位數的數組需要90+毫秒。 – kennebec 2012-04-06 15:28:28

+1

@Creynders:Fish使用數組的方式,它與使用非數組對象完全相同;沒有速度差異。他/她根本沒有使用它的數組屬性,當然,JavaScript數組[只是對象](http://blog.niftysnippets.org/2011/01/myth-of-arrays。 HTML),不是真正的數組。 – 2012-04-06 16:16:49

2

是的,這是可能的。

  1. 使用Math.random產生僞隨機數。 Math.random返回一個大於或等於0且小於1的僞隨機數,因此要得到一個10位數的數字(假設是一個整數),您會將其乘以1,000,000,000並將其與Math.roundMath.floor。 (如果你需要他們所有爲10個位數,相應地調整  —加鹼量,通過一個較大的數字乘以等)

  2. 使用對象跟蹤它們,所以var obj = {};下手。

  3. 將數字存儲爲對象中的鍵,例如, obj[number] = true

  4. 測試對象是否具有使用if (obj[number])

  5. 循環,直到你有唯一編號的正確數生成的數字。

我使用對象來存儲數字的原因是JavaScript對象是按照其本質映射的,並且引擎經過優化以快速從對象中檢索屬性。在封面之下,一個實現可以做它喜歡的事情,但可能會使用一個哈希表或類似的。

請注意,對此使用「數組」是不必要的; JavaScript arrays aren't really arrays,它們只是具有一些特殊功能的對象。

+3

乘以1,000,000,000並不保證10位數字 – 2012-04-06 11:45:38

+2

@Balaswamyvaddeman:我認爲他的意思是10位*或更少*。 (你的downvote,或別人的?似乎相當強大的這樣一個小缺陷。) – 2012-04-06 12:27:13

+2

我只是指着那,而不是我downvote – 2012-04-06 12:34:29

-2

爲什麼不呢?這裏是代碼:

var a=[]; 
for (var i=1000; i--;) 
a.push(Math.random()*10000000000) 
+4

我相信這有可能造成重複。 – 2012-04-06 11:37:40

+1

這並不保證數字有10位數字。 – RobG 2012-04-06 11:43:54

+0

是的,我同意你們兩個。但是對於這個特定的任務可能會有好處。其他檢查將只是一個不必要的複雜。 – 2012-04-06 11:50:07

1

用於生成長度爲l的N個隨機數可能是一個通用的功能:

// Generate n unique random numbers of length l 
// l should be less than 15 
function genNRandLen(n, l) { 

    // Make sure l and n are numbers 
    n = Number(n); 
    l = Number(l); 

    // Protect against bad input 
    if (isNaN(l) || isNaN(n)) return; 

    var o = {}, a = [], num; 
    var min = l == 1? 0 : Math.pow(10, l-1); 
    var r = Math.pow(10, l) - min; 

    // Protect against endless loop 
    if (n >= (r)) return; 

    while (n--) { 
    do { 
     num = Math.floor(min + (Math.random()*r)); 
    } while (o[num]) 

    o[num] = true; 
    a[n] = num; 
    } 
    return a.sort(); 
} 

排序是這只是爲了容易看重複測試時,如果不是必要的或隨機的順序是優選的除去。

如果需要長於15位的數字,可以通過連接較短的隨機數字符串並修剪爲所需的長度來創建它們。下面將產生任意長度的隨機數:

// Generate random number of length l 
function randLen(l) { 
    var n = ''; 
    while (n.length < l) { 
    n += String(Math.random()).replace(/^0\.0*/,''); 
    } 
    return n.substring(0, l); 
} 

它必須返回一個字符串,因爲轉換爲數字將混亂的結果。哦,所有數字都是整數。