配列内の要素をランダム化しますか?
-
03-07-2019 - |
質問
私はアーティストの友人のためにサイトを作成しました。彼女はレイアウトを同じままにしたいのですが、彼女が制作した新しい絵画を現在のレイアウトにミックスしたいのです。メインギャラリーページに12個のサムネイル(thumb1-thumb12)と18個の画像(img1-img18)も配置します
私が考えたアプローチは、すべての画像の配列を作成し、ランダム化してから、最初の12個を単純に削り取り、サムスロットに読み込むことでした。別のアプローチは、配列から12個の画像をランダムに選択することです。最初のケースでは、配列の要素をランダム化する方法が見つかりません。後者の場合、2番目の配列を使用する以外に、画像を2回以上読み込まないようにする方法を頭に入れられません。これは非常に非効率的で恐ろしいことです。
ちなみに、これらすべてをJavascriptで行っています。
解決
私はこれを少し前に書いたので、たまたまあなたが探しているものに合うようになりました。 ojblassが参照するのは、Fisher-Yatesシャッフルだと思います:
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);
他のヒント
Fisher-Yatesシャッフル(別名Knuthシャッフル)を実装する必要があります)。
提供された素晴らしい回答をご覧くださいこちら。
最初のアプローチが機能します。 18個の要素をシャッフルして、最初の12個を取得します。
最近、この問題に自分で遭遇しました。こちらの投稿が役に立ちました: 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;