javascript - javascript從 array 中抽取隨機子集

  显示原文与译文双语对照的内容
59 2

什麼是一種乾淨的方法,採取隨機樣本,而不是從javascript中更換一個 array?假設有一個數組

x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

我想隨機採樣 5個惟一值;換句話說,生成長度為 5的隨機子集。若要生成一個隨機示例,可以執行以下操作:

x[Math.floor(Math.random()*x.length)];

但如果這是多次完成的,那麼多次獲取同一條目的風險。

时间:原作者:0个回答

127 5

我建議使用 fisher yates洗牌機洗牌,並截取一段:

function getRandomSubarray(arr, size) {
 var shuffled = arr.slice(0), i = arr.length, temp, index;
 while (i--) {
 index = Math.floor((i + 1) * Math.random());
 temp = shuffled[index];
 shuffled[index] = shuffled[i];
 shuffled[i] = temp;
 }
 return shuffled.slice(0, size);
}
var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var fiveRandomMembers = getRandomSubarray(x, 5);

注意,這不是獲得大型 array 隨機子集的最有效的方法,因為它不必要地打亂整個 array 。為了獲得更好的性能,你可以執行部分洗牌:

function getRandomSubarray(arr, size) {
 var shuffled = arr.slice(0), i = arr.length, min = i - size, temp, index;
 while (i--> min) {
 index = Math.floor((i + 1) * Math.random());
 temp = shuffled[index];
 shuffled[index] = shuffled[i];
 shuffled[i] = temp;
 }
 return shuffled.slice(min);
}
原作者:
97 2

派對有點晚了,但這可以用 underscore 示例方法( 下劃線 1.5.2 - 2013年月 ) 來解決:

var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var randomFiveNumbers = _.sample(x, 5);
原作者:
...