2015-11-01 34 views
0

由樂透發電機代碼Hallo我在一個「生成」循環中得到了一些數字雙。這是代碼:樂透發電機javascript

function lottery() { 
    for (var i=0; i<=7; i++) { 
     var lottery = Math.floor(Math.random() * 49); 
     document.getElementById ("lotto" + i).innerHTML = lottery; 
    } 
} 

誰知道問題在哪裏?謝謝!

+4

你需要以某種方式保存你有哪些號碼已經生成。 – JNK

+0

現在我知道我將使用每個Mittwoch和Samstag ... – baao

+0

@Michael你最好使用一個更好的隨機生成器。例如:random.org – zerkms

回答

1

像@JNK評論的那樣,您需要存儲已使用的值以避免再次使用它們。

最簡單的方法是將它們存儲在數組中,並檢查它們是否已被使用。

function lottery() { 
    var used = []; 
    for (var i=0; i<=7; i++) { 

     var lottery; 
     while(true) { // this loop keeps going until a new number is found 
      lottery = Math.floor(Math.random() * 49); 
      var newNum = true; 
      for(var j=0; j<used.length; j++) { 
       if(used[j] == lottery) { 
        newNum = false; // if already used, set newNum to false 
        break; 
       } 
      } 
      if(newNum) { // if not already used, then add num to used array 
       used.push(lottery); 
       break; 
      } 
     } 

     document.getElementById ("lotto" + i).innerHTML = lottery; 
    } 
} 
+1

另一種可能的方式在這裏描述:http://united-coders.com/christian-harms/javascript-challenge-lotto-number-generator/ – JNK

+1

@JNK是的,我知道這不是最有效的方法......但這是我想到的最直接的方式。我真的很喜歡那個鏈接中的優化。 –

0

與其他方法類似,但只使用一個循環。

function lottery() { 
    var winners = []; 
    while (winners.length < 7) { 
    var lottery = Math.floor(Math.random() * 49); 
    if (winners.indexOf(lottery) === -1) { 
     winners.push(lottery); 
     document.getElementById ("lotto" + winners.length).innerHTML = lottery; 
    } 
    } 
} 
1

從他的鏈接中獲得的這個JNK的所有學分。這不是非常直觀的(它像代碼高爾夫球一樣被最小化),但它是一個有趣的解決方案。

優化隨機數發生器(86個字節):

var getRandomLottoNumbers = function() { 
    var n=[],i=0; 
    for(;++i<50;) 
     n.push(i); 
    for(;--i>6;) 
     n.splice(i*Math.random()|0,1); 
    return n 
}; 

完整解釋here

2

只是爲了好玩:O(N)溶液(其它貼有O(N^2)

它使用Fisher-Yates shuffle algorithm然後第一7元素都被打亂後,需要他們爲是。

所以,沒必要檢查是否有任何的數字已經得出:

const arr = Array(50).fill(0).map((_, i) => i); 
const DRAW = 7; 

const rand = (from, to) => Math.floor(Math.random() * (to - from + 1)) + from; 

for (let i = 0; i < DRAW; ++i) { 
    const r = rand(i, arr.length - 1); 
    [arr[r], arr[i]] = [arr[i], arr[r]]; 
} 

const selected = arr.slice(0, DRAW); 

參考文獻: