使用“随机”数组
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