开发者问题收集

使用“随机”数组

2011-07-10
126

对于正在制作的游戏:使用一个 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] )?

1个回答

尝试 此 jsfiddle ,并将 numRums 调高到您想要的值。我没有看到有意义的偏差,每次运行它都会得到不同的结果。百分比显示是预期平均值的百分比。经过足够多次运行,我看到大约 0.01% 的变化。

此外,这里有一个 更高级的 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%)
jfriend00
2011-07-10