「JavaScriptで配列からランダムに要素にアクセスする方法」に取り組んでいます。これに関する多くのリンクが見つかりました。同様に: JavaScript 配列からランダムなアイテムを取得する
var item = items[Math.floor(Math.random()*items.length)];
ただし、この場合、配列から 1 つの項目しか選択できません。複数の要素が必要な場合、どうすればこれを達成できますか? 配列から複数の要素を取得するにはどうすればよいですか?
「JavaScriptで配列からランダムに要素にアクセスする方法」に取り組んでいます。これに関する多くのリンクが見つかりました。同様に: JavaScript 配列からランダムなアイテムを取得する
var item = items[Math.floor(Math.random()*items.length)];
ただし、この場合、配列から 1 つの項目しか選択できません。複数の要素が必要な場合、どうすればこれを達成できますか? 配列から複数の要素を取得するにはどうすればよいですか?
わずか2行:
// Shuffle array
const shuffled = array.sort(() => 0.5 - Math.random());
// Get sub-array of first n elements after shuffled
let selected = shuffled.slice(0, n);
それを行う関数を作成します。
var getMeRandomElements = function(sourceArray, neededElements) {
var result = [];
for (var i = 0; i < neededElements; i++) {
result.push(sourceArray[Math.floor(Math.random()*sourceArray.length)]);
}
return result;
}
sourceArray に返される要素が十分にあるかどうかも確認する必要があります。一意の要素を返す場合は、選択した要素を sourceArray から削除する必要があります。
繰り返しなしでループ内の配列からアイテムをランダムに取得したい場合は、選択したアイテムを配列から削除できますsplice
。
var items = [1, 2, 3, 4, 5];
var newItems = [];
for (var i = 0; i < 3; i++) {
var idx = Math.floor(Math.random() * items.length);
newItems.push(items[idx]);
items.splice(idx, 1);
}
console.log(newItems);
Array.prototype.getnkill = function() {
var a = Math.floor(Math.random()*this.length);
var dead = this[a];
this.splice(a,1);
return dead;
}
//.getnkill() removes element in the array
//so if you like you can keep a copy of the array first:
//var original= items.slice(0);
var item = items.getnkill();
var anotheritem = items.getnkill();
編集: このソリューションは、少数の要素のみを取得する場合、ここに示す他のソリューション (ソース配列をスプライスする) よりも遅くなります。このソリューションの速度は、元の配列の要素数のみに依存しますが、スプライシング ソリューションの速度は、出力配列に必要な要素の数に依存します。
繰り返さないランダムな要素が必要な場合は、配列をシャッフルしてから、必要な数だけ取得できます。
function shuffle(array) {
var counter = array.length, temp, index;
// While there are elements in the array
while (counter--) {
// Pick a random index
index = (Math.random() * counter) | 0;
// And swap the last element with it
temp = array[counter];
array[counter] = array[index];
array[index] = temp;
}
return array;
}
var arr = [0,1,2,3,4,5,7,8,9];
var randoms = shuffle(arr.slice(0)); // array is cloned so it won't be destroyed
randoms.length = 4; // get 4 random elements
デモ: http://jsbin.com/UHUHuqi/1/edit
ここから取得したシャッフル機能: https://stackoverflow.com/a/6274398/1669279
これが最も正しい答えで、ランダム + ユニーク要素が得られます。
function randomize(array, n)
{
var final = [];
array = array.filter(function(elem, index, self) {
return index == self.indexOf(elem);
}).sort(function() { return 0.5 - Math.random() });
var len = array.length,
n = n > len ? len : n;
for(var i = 0; i < n; i ++)
{
final[i] = array[i];
}
return final;
}
// randomize([1,2,3,4,5,3,2], 4);
// Result: [1, 2, 3, 5] // Something like this