OSTRZEŻENIE: Zastosowanie procesora idzie do 100%, bądź ostrożny.

Link do JSFiddle

Ten skrypt został napisany w celu zaprojektowania dynamicznego węża i płyty drabinkowej. Za każdym razem, gdy strona jest odświeżona nowa płyta. Przez większość czasu wszystkie obrazy tła nie pojawiają się, a użytkowanie procesora idzie do 100%. Ale czasami pojawiają się wszystkie z nich, a użytkowanie procesora jest normalne.

Opera pokazuje niektóre obrazy tła, Firefox Lags i pyta mnie, jeśli chcę zatrzymać skrypt.

Wierzę, że problem dotyczy tych linii kodu:

        for(var key in origin)      // Need to implement check to ensure that two keys do not have the same VALUES!
        {
            if(origin[key] == random_1 || origin[key] == random_2 || key == random_2)   // End points cannot be the same AND starting and end points cannot be the same.
            {
                valFlag = 1;
            }
            console.log(key);
        }
2
Abijeet Patro 7 sierpień 2012, 13:01

2 odpowiedzi

Najlepsza odpowiedź

Twój algorytm jest bardzo nieskuteczny. Gdy tablica jest prawie wypełniona, dosłownie robicie miliony bezużytecznych iteracji, dopóki nie będziesz na szczęściu, a RNG przypadkowo wybiera brakujący numer. Przepisz go do:

  1. Wygeneruj tablicę wszystkich możliwych liczb - od 1 do 99.
  2. Gdy potrzebujesz liczb losowych, generuj losowy indeks w bliżystym granicach tej tablicy, elementu do splątania i tej losowej pozycji, usuwając go z tablicy i użyj jego wartości jako żądanej liczby losowej.
  3. Jeśli generowane liczby nie pasują do niektórych warunków (Mindiff?) Zwróć je z powrotem do tablicy. Uwaga, aby nadal można przeciągnąć w pętli na zawsze, jeśli wszystko, co pozostało w tablicy nie jest w stanie dopasować swoich warunków.

Każda wartość, którą ciągniesz z tablicy w ten sposób gwarantuje, że będzie wyjątkowy, ponieważ pierwotnie wypełniasz go unikalnymi numerami i usunąć je na użycie.

Dopasowałem rysunek i umieściłem generowane numery w tablicy, którą możesz sprawdzić w konsoli. Umieść swój rysunek i powinien działać - numery są generowane natychmiast:

var snakes = ['./Images/Snakes/snake1.png','./Images/Snakes/snake2.jpg','./Images/Snakes/snake3.gif','./Images/Snakes/snake4.gif','./Images/Snakes/snake5.gif','./Images/Snakes/snake6.jpg'];
var ladders = ['./Images/Ladders/ladder1.jpg','./Images/Ladders/ladder2.jpg','./Images/Ladders/ladder3.png','./Images/Ladders/ladder4.jpg','./Images/Ladders/ladder5.png'];


function drawTable()
{
    // Now generating snakes.
    generateRand(snakes,0);
    generateRand(ladders,1);

}

var uniqNumbers = []
for(var idx = 1; idx < 100; idx++){ uniqNumbers.push(idx) }

var results = []

function generateRand(arr,flag)
{
    var valFlag = 0;
    var minDiff = 8;        // Minimum difference between start of snake/ladder to its end.
    var temp;

    for(var i = 0; i< arr.length; ++i) {

        var valid = false

        // This is the single place it still can hang, through with current size of arrays it is highly unlikely
        do {
            var random_1 = uniqNumbers.splice(Math.random() * uniqNumbers.length, 1)[0]
            var random_2 = uniqNumbers.splice(Math.random() * uniqNumbers.length, 1)[0]
            if (Math.abs(random_1 - random_2) < minDiff) {
                // return numbers
                uniqNumbers.push(random_1)
                uniqNumbers.push(random_2)
            } else {
                valid = true
            }
        } while (!valid);


        if(flag == 0)     // Snake
        {
            if(random_1 < random_2)        // Swapping them if the first number is smaller than the second number.
            {
                var temp = random_1; random_1 = random_2; random_2 = temp
            }
        }
        else         // Ladders
        {
            if(random_1>random_2)        // Swapping them if the first number is greater than the second number.
            {
                var temp = random_1; random_1 = random_2; random_2 = temp
            }
        }
        // Just for debug - look results up on console
        results.push([random_1, random_2])
    }
}

drawTable()
2
Oleg V. Volkov 7 sierpień 2012, 11:46

Miałem problem tak, że przy użyciu "Highcharts", w Loop - "Przeglądarki" mają wbudowaną funkcjonalność do wykrywania martwych skryptów lub nieskończonych pętli. Tak więc przeglądarki zatrzymują się lub wyskakują wiadomości, że nie odpowiadają. Nie jestem pewien, czy masz ten objaw!

Wynikano to z "pętli" z dużą pulą danych. Napisałem samouczek na nim na CodeProject, możesz spróbować, a może to być twoja odpowiedź.

http://www.codeproject.com/tips/406739/preventing-stop-unning-this-script-in-browsers.

1
Dane Balia 7 sierpień 2012, 10:39