8

私は私の友人のアーティストのためにサイトを作成しました。彼女はレイアウトを同じに保ちたいと思っていますが、彼女はまた、彼女が作成した新しい絵画を現在のレイアウトに混ぜたいと思っています。したがって、メインギャラリーページに12個のサムネイル(thumb1-thumb12)があり、18個の画像(img1-img18)も配置します。

私が考えたアプローチは、すべての画像の配列を作成し、それをランダム化してから、最初の12枚を削り取り、サムスロットにロードすることでした。別のアプローチは、アレイからランダムに12枚の画像を選択することです。最初のケースでは、配列の要素をランダム化する方法を見つけることができません。後者の場合、非常に非効率的で恐ろしいように見える2番目の配列を使用する以外に、画像が2回以上読み込まれないようにする方法に頭を悩ませることはできません。

ちなみに、私はこれらすべてをJavascriptで行っています。

4

4 に答える 4

18

私はこれをしばらく前に書いたので、たまたまあなたが探しているものに合っています。ojblass が言及しているのは、Fisher-Yates shuffle だと思います。

Array.prototype.shuffle = function() {
   var i = this.length;
   while (--i) {
      var j = Math.floor(Math.random() * (i + 1))
      var temp = this[i];
      this[i] = this[j];
      this[j] = temp;
   }

   return this; // for convenience, in case we want a reference to the array
};

Array.prototype の変更は不適切な形式と見なされる可能性があることに注意してください。これを、配列を引数として受け取るスタンドアロン メソッドとして実装することをお勧めします。とにかく、それを締めくくるには:

var randomSubset = originalArray.shuffle().slice(0,13);

または、オリジナルを実際に変更したくない場合は、次のようにします。

var randomSubset = originalArray.slice(0).shuffle().slice(0,13);
于 2009-05-02T01:41:55.583 に答える
6

フィッシャー-イェーツシャッフル(別名、クヌースシャッフル)を実装する必要があります。

ここで提供されるすばらしい答えを見てください。

于 2009-05-02T01:36:14.490 に答える
1

あなたの最初のアプローチはうまくいくでしょう。18 個の要素をシャッフルして、最初の 12 個を取ります。

于 2009-05-02T01:38:16.747 に答える
1

私は最近、この問題に遭遇しました。ここの投稿が役に立ちました: http://waseemsakka.com/2012/02/14/javascript-dropping-the-last-parts-of-an-array-and-randomizing-the-order-of-an-array/

基本的に、配列をランダム化することから始めます。

thumbs.sort(function(a, b) {
     return Math.random() - 0.5;
})

これにより、18 個の要素の順序がランダム化されます。次に、最初の 12 要素のみを保持するには、最後の 6 要素を削除します。

thumbs.length = 12;
于 2012-02-28T11:55:19.747 に答える