152

「JavaScriptで配列からランダムに要素にアクセスする方法」に取り組んでいます。これに関する多くのリンクが見つかりました。同様に: JavaScript 配列からランダムなアイテムを取得する

var item = items[Math.floor(Math.random()*items.length)];

ただし、この場合、配列から 1 つの項目しか選択できません。複数の要素が必要な場合、どうすればこれを達成できますか? 配列から複数の要素を取得するにはどうすればよいですか?

4

24 に答える 24

255

わずか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);

デモ:

于 2016-07-25T14:57:52.430 に答える
12

それを行う関数を作成します。

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 から削除する必要があります。

于 2013-10-09T10:37:05.733 に答える
8

繰り返しなしでループ内の配列からアイテムをランダムに取得したい場合は、選択したアイテムを配列から削除できます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);

于 2013-10-09T10:41:37.210 に答える
3
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();
于 2013-10-09T10:47:16.777 に答える
1

編集: このソリューションは、少数の要素のみを取得する場合、ここに示す他のソリューション (ソース配列をスプライスする) よりも遅くなります。このソリューションの速度は、元の配列の要素数のみに依存しますが、スプライシング ソリューションの速度は、出力配列に必要な要素の数に依存します。

繰り返さないランダムな要素が必要な場合は、配列をシャッフルしてから、必要な数だけ取得できます。

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

于 2013-10-09T10:40:02.590 に答える
-2

これが最も正しい答えで、ランダム + ユニーク要素が得られます。

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
于 2016-12-26T11:10:23.610 に答える