2011-07-10 145 views
0

對於正在醞釀中的遊戲工作:使用一個HTML5 <audio>元素和一些JavaScript,我試圖創建一個選擇來自物體的隨機鍵(這將是一個數組)的播放列表。所選對象基於玩家狀態的「心情」。然後我從數組中提取歌曲的源URL,如果所選歌曲尚未播放,請加載它,然後播放它。該play功能如下(這是一個對象字面的一部分):與「隨機」陣列

play: function(option) { 
    if (G.audio.enabled) { 
     var player = G.audio.player, 
      playlist = G.audio.playlist; 

     if (option && G.audio.playlist[option]) { 
      G.audio.mood = option; 
      var song = playlist[option][Math.floor(Math.random() * (playlist[option].length))][2]; 
      if (G.audio.current != song) { 
       G.audio.current = song; 
       player.attr("src", song); 
       player[0].load(); 
       player[0].play(); 
      } else { 
       G.audio.play(G.audio.mood); 
      } 
     } else { 
      G.audio.play(G.audio.mood); 
     } 

     try { 
      player[0].removeEventListener("ended", G.audio.play); 
     } catch (e) {} 
     player[0].addEventListener("ended", G.audio.play); 
    } 
} 

因此,舉例來說,如果我們用處理(且只有)「英雄」類(這是情緒),G.audio.playlist應該是這樣的:

heroic: [ 
    [ 
    "Song Title", 
    "Artist", 
    "Source url", 
    "other info" 
    ], 

    [ 
    "Song Title", 
    "Artist", 
    "Source url", 
    "other info" 
    ], 

    [ 
    "Song Title", 
    "Artist", 
    "Source url", 
    "other info" 
    ] 
]; 

一切工作正常,除了一兩件事:第二首很少玩,而第一和第三通常是在負載玩的人。

所以,我的問題是,是否有關於爲什麼任何邏輯推理:

playlist[option][Math.floor(Math.random() * (playlist[option].length))][2]; 

會給予優先於數組的第一個([0])和第三個鍵([2])?

+0

您確定存在偏見嗎?你的隨機數生成代碼看起來很好...... – emboss

回答

2

嘗試this jsfiddle並且將numRums調高至所需的最大值。我沒有看到有意義的偏見,每次運行它都會產生不同的結果。百分比顯示是預期平均值的百分比。我看到大約有0.01%的變化,足夠的運行。

而且,這裏是一個more advanced jsfiddle,您可以根據需要運行儘可能多的迭代,而不會讓瀏覽器對運行腳本的長度感到不滿。如果你願意,你可以從字面上運行1億次迭代。這是我通過在三個桶上運行十億次迭代得到的結果:

Number of Cycles Executed: 1,000,000,000 
333,317,410 (-0.004777%) 
333,330,202 (-0.000939%) 
333,352,388 (+0.005716%)