2014-02-12 78 views
0

我正在嘗試創建一個輸出每個數字1-10的腳本。 在JavaScript中使用隨機數字生成器。如何輸出從1到10的每個數字。在JavaScript中使用隨機數字

我希望每個數字都是唯一的。 這裏是什麼,我想腳本輸出的例子:

5 9 7 6 1 3 4 8 2 10 

這是我的嘗試:

var test = []; 
    var amountOfNumbers = 10; 
    var inArray = false; 
    var useNumbers = []; 
    for(var i=0; useNumbers.length<=amountOfNumbers; i++){ 
     var rng = Math.floor((Math.random()*amountOfNumbers)+1); 
     for(var a=0; a<=test.length; a++){ 
      if(rng == test[a]){ 
       inArray == true; 
      } 
     } 
     if(!inArray){ 
      document.write(rng); 
      test.push(rng); 
      useNumbers.push(rng); 
     } 
    } 

希望能對你有所幫助。

備案,我不感興趣的jQuery OG任何其他庫:)

+5

生成數字從1到10,然後洗牌:http:// stackoverflow。com/questions/2450954/how-to-randomize-shuffle -a-javascript-array – NPE

回答

5

1)如何解決你的代碼

你有幾個錯誤,其中包括你不是事實重置inArrayfalse,並且您不遍歷整個test數組(使用<,而不是<=)。但是,使用一個循環來看看你是否已經擁有了數是沒有效率的,最好是用一個對象作爲地圖:

var test = []; 
var amountOfNumbers = 10; 
var useNumbers = {}; 
for(var i=0; test.length<amountOfNumbers; i++){ 
     var rng = Math.floor((Math.random()*amountOfNumbers)+1); 
     if(!useNumbers[rng]){ 
      document.write(rng); 
      test.push(rng); 
      useNumbers[rng] = true; 
     } 
} 

2)如何做正確

你的算法將循環,直到有足夠的幸運找到剩餘的數字。這是不高效的,不可預測的。正常可靠的做法是

  1. 以生成所述陣列[1..10]
  2. 洗牌它

生成所述整數的1至N的陣列可以用一個簡單的循環來進行或以華麗的方式:

var arr = Array.apply(0,new Array(N)).map(function(_,i){ return i+1 }); 

洗牌陣列通常與Fisher-Yates algorithm,而您可以輕鬆地查找JS實現完成的(很容易無論如何寫)。快速(理論上不能保證所有未來sort實現工作)的替代是這個:

arr = arr.sort(function(a,b){ return Math.random()>0.5 }); 

The whole program

+1

很好的方法可以在一行中生成一個有序數組。 Upvoting! – adripanico

+0

@adripanico你注意到我的整個程序,包括shuffing,是兩行嗎? –

+0

啊,我沒有注意到這個版本。我應該刪除我的答案嗎? – adripanico

1

你的做法意味着,檢查了所有的陣列中的每一步,尋找,如果你的隨機數已經在陣列中,這意味着很多時間浪費了。

最佳方法是對有序數組進行無序化。在每個循環中,我們生成一個隨機數(例如0到1之間的一個數字),並有50%的概率,我們將當前位置中的項目更改爲隨機位置中的其他項目(在0和長度之間數組)。

希望它有幫助。

function disorder(arg) { 
    for (var i = 0; i < arg.length; i++) { 
     if (Math.random() < 0.5) { 
      var aux = arg[i]; 
      var rndPos = Math.floor(Math.random()) * arg.length; 
      arg[i] = arg[rndPos]; 
      arg[rndPos] = aux; 
     } 
    } 
    return arg; 
} 

var myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 

var myNewArray = disorder(myArray); 

myNewArray.forEach(function(item) { 
    console.log(item); 
}); 
相關問題