0

6 つのスライドを含むスライダーを作成しています。前の 2 つのスライドが次のスライドとして表示されないように、それらの間をランダムに移動したいと考えています。私が実際に行っているのは、乱数を生成し、前の 2 つを追跡することなので、機能はそれほど重要ではありません。最初のスライドには常に 1 の番号が付けられるため、最初の 2 つの反復では、使用できない前の番号の 1 つになります。

これは私がこれまでに持っていたもので、範囲内の乱数を生成するためにうまく機能しますが、最後の2つの値を「キャッシュ」することは確実に機能しません:

        var rand = Math.floor(Math.random() * 6) + 1;
        var prev1 = 1;
        var prev2;

        function randomSlide() {
            // 5 second interval between slides
            // Don't show either of previous two slides next
            random = setInterval(function() {
                prev2 = prev1;
                prev1 = rand;

                do {
                    rand = Math.floor(Math.random() * 6) + 1;
                } while (rand == prev1 || rand == prev2);

                prev1 = rand;

                $('#slider').anythingSlider(rand);

                //console.log(prev1,prev2);


            }, 5000);
        }
        function firstSlide() {
            firstTime = setTimeout(function() {
                randomSlide();
            }, 5000);
        }

        firstSlide();            
        randomSlide();

非常に単純だと思いますが、私の脳は、最初に 2 つの「キャッシュ」変数の値を解析しようとして頭がおかしくなり、その後の各反復で混乱しています。

randomSlide() がロード時に実行されると、最初の (ようこそ) スライドが表示される機会が得られないため、最初に単一の反復を実行しています。

4

2 に答える 2

4

prev1 = randの値を変更した後に 2 回目の操作を行うと、新しいスライドの番号がそれにrand割り当てられます。次にループに入るときは、を実行します。これは、 3 つの変数 と がすべて同じであることを意味します。2番目を削除するだけです。prev2 = prev1prev1 == randprev1prev2randprev1 = rand

もう 1 つの問題は、間隔を 2 回設定することです。最初に5 秒の遅延 (1 つの間隔を設定) 後にfirstSlide()実行する呼び出しを呼び出し、次に別の間隔を設定する再度randomSlide()呼び出しの直後に実行します。randomSlide()

于 2012-06-24T09:36:21.447 に答える
0

結果を取得するための別の (より簡単な?) アプローチを次に示します。

<script>

// Return a random number from 1 to 6, exclude 
// the last two numbers.
var getRandom = (function() {
  var a = [1,2,3,4,5,6];

  return function() {
    var i = (Math.random() * 4 ) | 0;
    a[5] = a.splice(i,1);
    return a[5];
  }
}());

function writeRandom() {
  document.getElementById('d0').innerHTML += getRandom() + '<br>';
}

setInterval(writeRandom, 100)
</script>

<div id="d0"></div>

最初の 2 回の反復では正確にランダムではありませんが、初期化時に配列をランダム化することで修正できます。しかし、スライド ショーでは問題にならない可能性があります。

コードは少ないですが、私がテストしたブラウザではスプライス部分が遅くなります。OPの私のバージョンは次のとおりです。

var getRandom2 = (function() {
  var r0 = r1 = r2 = 1;

  return function() {
    r0 = r1;
    r1 = r2;

    do {
      r2 = Math.floor(Math.random() * 6) + 1;
    } while (r2 == r0 || r2 == r1);

    return r1;
  }
}());
于 2012-06-24T10:42:05.260 に答える