我想要在循環中使用 javascript生成至少1000個唯一的隨機數,並使用10位數字。這可能嗎?或者JavaScript是一個錯誤的事情呢?在循環中使用javascript生成1000個隨機10位數字
UPDATE:您將如何確保不會創建重複項?
我想要在循環中使用 javascript生成至少1000個唯一的隨機數,並使用10位數字。這可能嗎?或者JavaScript是一個錯誤的事情呢?在循環中使用javascript生成1000個隨機10位數字
UPDATE:您將如何確保不會創建重複項?
這是我會怎麼做:
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。儘管當你談論大量獨特的隨機數時,我認爲沒有辦法解決這種潛在的問題。
我會改變軌道到一個對象,現在軌道是一個AWFUL很多元素的數組。使用對象會更快。 – Creynders 2012-04-06 12:14:48
我在測試中的方法需要8-9毫秒,使用一個帶有循環的數組來檢查重複數據需要40-50毫秒,並且使用一個對象並從中恢復一個10位數的數組需要90+毫秒。 – kennebec 2012-04-06 15:28:28
@Creynders:Fish使用數組的方式,它與使用非數組對象完全相同;沒有速度差異。他/她根本沒有使用它的數組屬性,當然,JavaScript數組[只是對象](http://blog.niftysnippets.org/2011/01/myth-of-arrays。 HTML),不是真正的數組。 – 2012-04-06 16:16:49
是的,這是可能的。
使用Math.random
產生僞隨機數。 Math.random
返回一個大於或等於0
且小於1
的僞隨機數,因此要得到一個10位數的數字(假設是一個整數),您會將其乘以1,000,000,000並將其與Math.round
或Math.floor
。 (如果你需要他們所有爲10個位數,相應地調整 —加鹼量,通過一個較大的數字乘以等)
使用對象跟蹤它們,所以var obj = {};
下手。
將數字存儲爲對象中的鍵,例如, obj[number] = true
。
測試對象是否具有使用if (obj[number])
循環,直到你有唯一編號的正確數生成的數字。
我使用對象來存儲數字的原因是JavaScript對象是按照其本質映射的,並且引擎經過優化以快速從對象中檢索屬性。在封面之下,一個實現可以做它喜歡的事情,但可能會使用一個哈希表或類似的。
請注意,對此使用「數組」是不必要的; JavaScript arrays aren't really arrays,它們只是具有一些特殊功能的對象。
乘以1,000,000,000並不保證10位數字 – 2012-04-06 11:45:38
@Balaswamyvaddeman:我認爲他的意思是10位*或更少*。 (你的downvote,或別人的?似乎相當強大的這樣一個小缺陷。) – 2012-04-06 12:27:13
我只是指着那,而不是我downvote – 2012-04-06 12:34:29
爲什麼不呢?這裏是代碼:
var a=[];
for (var i=1000; i--;)
a.push(Math.random()*10000000000)
我相信這有可能造成重複。 – 2012-04-06 11:37:40
這並不保證數字有10位數字。 – RobG 2012-04-06 11:43:54
是的,我同意你們兩個。但是對於這個特定的任務可能會有好處。其他檢查將只是一個不必要的複雜。 – 2012-04-06 11:50:07
你可以在JS中做到這一點,但你必須檢查數組,看它是否包含當前生成的隨機數。這顯然會降低性能。
看看這些答案是否有幫助。
用於生成長度爲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);
}
它必須返回一個字符串,因爲轉換爲數字將混亂的結果。哦,所有數字都是整數。
是的,這是可能的JavaScript。 – 2012-04-06 11:33:41
是的,這是可能的。你想要做這個提示嗎? – RobG 2012-04-06 11:33:43