2015-03-23 4 views
0

У меня есть сайт с аудиоплеером, и я пытаюсь улучшить случайный вариант, добавив параметр, который позволит пользователю изменить минимальное количество музыки, которое необходимо воспроизвести, чтобы за ту же музыку, чтобы снова выбратьjQuery застрял в бесконечном цикле

так в основном: Song 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++; 
} 

проблема:

после третьей песни, веб-страницы, замерзает, и мне нужно, чтобы перезапустить его, таким образом, есть бесконечный цикл там, но я путать себя с моим собственным кодом, кто-нибудь знает, что причина этого бесконечная петля.

here's a link to the website with the problem

+1

Я думаю, что один из ваших 'условий if' всегда«истина», так что вы рекурсивного вызова' randomizeTrack () 'бесконечно. Если вы смутили себя своим собственным кодом, вероятно, пора переписать его. – Jack

+0

Дело в том, что я только что написал этот код –

+0

Вы также, вероятно, никогда не добираетесь до конца своей функции, поэтому 'songListNumber' никогда не изменяется. – Jack

ответ

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]

+0

Песня - это номер текущей песни, songListNumber - это количество песен, которые были воспроизведены всего, я пытаюсь просмотреть последние песни tweenSongs, чтобы увидеть, является ли одна из них той же песней, что и случайная выборка. –

+0

Право. Моя первая версия была своего рода мучительной логикой. Я очистил его, чтобы более точно соответствовать вашим требованиям. Бесконечная часть - это тот факт, что вы проверяете songListNumber в своем цикле - вам нужно вместо этого проверять переменную цикла. Лично я бы, вероятно, написал бы это без рекурсии, вместо этого, вместо цикла «do-while (tooRecent)». – Danny

+0

Я пробовал код, который вы очистили, и он переходит в бесконечный цикл после пятой песни –

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); 
+0

, заменив его на songListNumber> 0 не помог печально –

+0

Я попробую еще раз. если никто не отвечает до –

+0

Я не могу найти, где проблема, поэтому я сделал новый код, чтобы дать вам случайное число в массиве. Я надеюсь, что это поможет вам. –

Смежные вопросы