2014-07-13 42 views
0
var globalScope = {} 


function generateNum() { 
    globalScope.genNum = []; 
    for (var i = 0; i < 4; i++) { 
     var numEl = Math.floor((Math.random() * 9)+1); 
     globalScope.genNum.push(numEl); 
    } 
    return globalScope.genNum; 
} 

大家好。我剛剛開始研究JS,我的HW是創建一個4位數組,陣列號從1到9(公牛隊和奶牛隊)。但我不知道如何實現檢查這個數組重複的數字。有人請幫忙。在此先感謝生成一個4位數組,其中包含不重複的數字

+0

一種方法是創建的數字從0數組至9以下,然後隨機[*剪接*](HTTP: //ecma-international.org/ecma-262/5.1/#sec-15.4.4.12)4位成員。這樣你就可以得到不重複的隨機數字。 – RobG

回答

1

另外,還可以使用含有全數字源陣列從09,每一次挑選和從源頭刪除其中的一個:

function genNum(){ 
    var arr = [], // target array 
     source = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0], // source array 
     sourceLen = source.length, 
     i, r; 

    for (i=0; i<4; i++) { 
     r = Math.floor(Math.random()*(sourceLen-i)); // pick a random index 
     // remove it from the source and add it to the target 
     arr.push(source.splice(r, 1)[0]); 
    } 

    // return it 
    return arr; 
} 

瞭解更多關於.splice方法上MDN

+0

謝謝。它幫助了很多。 – Rewmel

0

,最好的辦法就是讓所有的數字數組,並從中提取數字:

var allDigits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    result = []; 
for (var i = 0; i < 4; i++) { 
    result[i] = allDigits.splice(Math.floor((Math.random() * allDigits.length) + 1, 1); 
} 
return result; 
+0

我很好奇,有趣的是,使用'[]'賦值而不是'push'的速度快了10倍以上(參見[benchmark](http://jsperf.com/push-vs-assignment-2))。 – bfontaine

+0

它是有道理的,''我''它只寫一次,'.push()'它只讀一次並寫入一次。數組越大,讀取時間越長。 (這只是一個受過教育的猜測,我不知道它是如何工作的)。 –

0

好了,你會想的第一件事就是從一個begginers點這樣做何時做觀點是想想你需要採取什麼步驟來做到這一點。

Psedocode

1, Generate random number. 
2, Place random number in array. 
3, Loop until array length = 4: 
4, Generate random number. 
5, Check if number is in array already. 
6, If number isn't in array already then add it. 

這使創建的代碼很容易,firsy你要產生一個隨機數,然後將其.push到一個數組。然後使用一個while循環直到array.length === 4。產生這種循環更多號碼,然後使用for loop來檢查,如果數組已經存在數,

for(var i = 0; i < array.length; i++){ 
    //Check here 
} 
0
var globalScope = {} 


function generateNum() { 
    globalScope.genNum = []; 
    while (globalScope.genNum.length < 4) { 
     var numEl = Math.floor((Math.random() * 9) + 1); 
     if (globalScope.genNum.indexOf(numEl) < 0) { 
      globalScope.genNum.push(numEl); 
     } 
    } 
    return globalScope.genNum; 
} 
+0

這是在O(n^2)中,而在涉及另一個數組的O(n)中有一個解決方案。 – bfontaine

0

這個功能基本上是你在找什麼(我猜):

  • 首先,選擇的範圍內的隨機index[0,10-i)
  • 然後,在條目#index數字添加到輸出陣列
  • 最後,複製在條目#i數字到條目#index

function generateNum() 
{ 
    var digits = [0,1,2,3,4,5,6,7,8,9]; 
    var output = []; 
    for (var i=0; i<4; i++) 
    { 
     var index = Math.floor(Math.random()*(10-i)); 
     output += digits[index]; 
     digits[index] = digits[10-i]; 
    } 
    return output; 
} 
相關問題