2011-07-10 107 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%)