1

私は Javascript の小さなスニペットを持っており、最初から最後まで順番に引用符のリストを循環しています。

ただし、すべての引用符が繰り返されるまで繰り返さずに、(順番ではなく) リストをランダムに調べてから、ランダムな引用符からもう一度始めたいと思います。どうすればこれを行うことができますか?

$(function(){
    var quotes = $('#quotes').children('.rotate-quote');
    firstQuo = quotes.filter(':first');
    lastQuo = quotes.filter(':last');
    quotes.first().show();
    setInterval(function(){
        if($(lastQuo).is(':visible')) {
            var nextElem = $(firstQuo);
        } else {
            var nextElem = $(quotes).filter(':visible').next();
        }
        $(quotes).filter(':visible').fadeOut(300);
        if($(lastQuo).is(':visible')) {
            setTimeout(function() {
                $(firstQuo).fadeIn(300);
            }, 600);

        } else {
            setTimeout(function() {
                $(nextElem).fadeIn(600);
            }, 600);
        }
    }, 10000);
});
4

4 に答える 4

2

デモで可能な解決策は次のとおりです。

var $container = $('div'),
    quotes = $('quote').hide().toArray(),
    delay = 500;

function shuffle(arr) {
  return arr.map(function(v){ return [v,Math.random()]; })
    .sort().map(function(v){ return v[0]; });
}

function loop() {
  $(shuffle(quotes)).each(function(i,el) {
    setTimeout(function(){ $(el).appendTo($container).show(); }, i*delay);
  });
}

function start() {
  function begin(){ $(quotes).hide(); loop(); }
  setInterval(begin, quotes.length * delay);
  begin();
}

start();

デモ: http://jsbin.com/agihix/1/edit

編集:これを小さなプラグインに変えました。ここから入手してください https://gist.github.com/elclanrs/5610886

于 2013-05-20T05:32:08.220 に答える
0

以下は quote 配列をコピーし、毎回ランダムにスライスします。wエントリがなくなると、最初からやり直します。

var randomQuote = (function() {
  var quotes = ['quote 0','quote 1','quote 2'];
  var quoteCopy = [];

  return function () {
    if (!quoteCopy.length) {
      quoteCopy = quotes.slice();
    }
    return quoteCopy.splice(Math.random()*quoteCopy.length | 0, 1)[0];
  }
}());
于 2013-05-20T05:43:44.893 に答える
0

Fisher Yates を表示するためだけに (私のコードではありません):

function fisherYates ( myArray ) {
  var i = myArray.length, j, temp;
  if ( i === 0 ) return false;
  while ( --i ) {
     j = Math.floor( Math.random() * ( i + 1 ) );
     temp = myArray[i];
     myArray[i] = myArray[j]; 
     myArray[j] = temp;
  }
  return myArray;
}

したがって、引用符を配列に取得し、その関数を実行してから、配列をループし、最後に到達したら、その関数を再度実行します。

于 2013-05-20T05:12:46.740 に答える
0

述べられているように、あなたのアルゴリズムは良いとは思いません。100 の引用符があり、次に完全なセットの最初のランダムなプレゼンテーションを行うとします。

最後に、あなたの説明にあるように、最初からやり直すので、見積もり 101 が 100 と同じ見積もりになる可能性があります。

より良い(より均一な)ものがあると思います

  1. 引用符をランダムにシャッフルしnます。これは、最初に 1 回だけ実行されます。
  2. 最初の引用を選択して表示します。
  3. リストから引用符を削除し、 と の間のランダムな位置に挿入しn-wますn(w例: n/2)。
  4. 必要な見積もりごとに 2 から繰り返します。

数値wは、シーケンスをどれだけランダムにするかを調整します...見積もりが提示された後の遅延が小さくなり、均一になります。

このアプローチでは、「配信エラー」は発生せず、次にクオートが提示されるまでの平均遅延は現在のポジションに依存しません。

于 2013-05-20T05:53:11.257 に答える