2

警告: CPU 使用率が 100% になるので注意してください。

jsFiddle へのリンク

このスクリプトは、動的なスネークとラダー ボードを設計するために作成されました。ページが更新されるたびに、新しいボードが作成されます。ほとんどの場合、すべての背景画像が表示されるわけではなく、CPU 使用率が 100% に達します。しかし、時折それらすべてが表示され、CPU 使用率は正常です。

Opera はいくつかの背景画像を表示し、Firefox は遅延し、スクリプトを停止するかどうか尋ねてきます。

問題は次のコード行にあると思います。

        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);
        }
4

2 に答える 2

2

あなたのアルゴリズムは非常に効果的ではありません。配列がほぼいっぱいになると、運が良ければ文字通り何百万もの無駄な反復を行い、RNGが誤って欠落している数を選択します。次のように書き直します。

  1. 1から99までのすべての可能な数の配列を生成します。
  2. 乱数が必要な場合は、この配列の現在の境界、スプライス要素、およびこのランダムな位置にランダムインデックスを生成し、配列から削除して、その値を目的の乱数として使用します。
  3. 生成された数値が条件の一部に適合しない場合(minDiff?)、それらを配列に戻します。アレイに残っているすべてのものが条件に適合しない場合でも、ループ内で永久にストールする可能性があることに注意してください。

この方法で配列から取得するすべての値は、元々一意の番号で埋めて使用時に削除するため、一意であることが保証されます。

図面を削除し、生成された数値を配列に配置して、コンソールで確認できるようにしました。図面を元に戻すと、機能するはずです。数値はすぐに生成されます。

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()
于 2012-08-07T10:59:46.160 に答える
1

forループで「HighCharts」を使用すると、このような問題が発生しました。「ブラウザ」には、デッドスクリプトまたは無限ループを検出する機能が組み込まれています。そのため、ブラウザーが停止するか、応答していないというメッセージがポップアップ表示されます。その症状があるかどうかわからない!

これは、大量のデータ プールによる「ループ」が原因でした。CodeProject でチュートリアルを書いたので、試してみてください。答えになるかもしれません。

http://www.codeproject.com/Tips/406739/Preventing-Stop-running-this-script-in-Browsers

于 2012-08-07T10:39:17.543 に答える