我有一个带有音频播放器的网站,我正在尝试通过添加一个选项来改善随机选项,该选项允许用户更改需要播放的最小音乐数量,以便获得相同的音乐再次选择
基本上是这样的: 歌曲N°15 - >至少X首不同的歌曲 - >歌曲N°15您可以使用滑块
更改X.这是我目前的代码:
var Song = 1;
var tweenSongs = 3;
var songList = [];
var songListNumber = 1;
function randomizeTrack() {
Song = Math.floor((Math.random() * songTotal) + 1);
if (songListNumber - tweenSongs < 1) {
for (i=0; i <= tweenSongs - 1; i++) {
if (Song == songList[songListNumber - i]) {
randomizeTrack()
}
}
}
else {
for (i=0; songListNumber != 0; i++) {
if (Song == songList[songListNumber - i]) {
randomizeTrack()
}
}
}
songList[songListNumber] = Song;
songListNumber++;
}
问题:
在第三首歌之后,网页冻结,我需要重新启动它,所以那里有一个无限循环,但是我把自己与自己的代码混淆了,有没有人知道是什么导致了这个无限循环。答案 0 :(得分:1)
在else
情况下你正在检查songListNumber不是0,并且在一首歌之后它再也不是0,所以循环是无限的。
我会删除递归,只需在单个循环中检查“太近”。只需检查列表的末尾,确保在检查完整个列表后停止,或超过tweenSongs
的数量
function randomizeTrack() {
var tooRecent = false;
do
{
Song = Math.floor((Math.random() * songTotal) + 1);
tooRecent = false;
for (var i=0; i < tweenSongs && i < songListNumber; i++)
{
if (songList[songListNumber - 1 - i] == Song)
{
// we can stop searching
tooRecent = true;
break;
}
}
}
while (tooRecent);
songList[songListNumber] = Song;
songListNumber++;
}
我认为您还需要将songListNumber
初始化为0
而不是1
。第一次通过你设置最初为空的数组的第二个元素并跳过songList[0]
答案 1 :(得分:0)
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
var Song = 1;
var tweenSongs = 10;
var songList = [];
var songListNumber = 1;
while(songList.length<=tweenSongs){
Song = Math.floor((Math.random() * tweenSongs) + 1);
if(!inArray(Song,songList)){
songList[songListNumber]=Song;
songListNumber++
}
}
console.log(songList);