问题描述
在不从 javascript 中的数组中进行替换的情况下,随机抽取样本的干净方法是什么?所以假设有一个数组
What is a clean way of taking a random sample, without replacement from an array in javascript? So suppose there is an array
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
我想随机抽样 5 个唯一值;即生成长度为 5 的随机子集.要生成一个随机样本,可以执行以下操作:
and I want to randomly sample 5 unique values; i.e. generate a random subset of length 5. To generate one random sample one could do something like:
x[Math.floor(Math.random()*x.length)];
但如果多次执行此操作,则存在多次抓取同一个条目的风险.
But if this is done multiple times, there is a risk of a grabbing the same entry multiple times.
推荐答案
我建议使用 Fisher-Yates shuffle 并取一片:
I suggest shuffling a copy of the array using the Fisher-Yates shuffle and taking a slice:
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);
请注意,这不是获取大型数组的小随机子集的最有效方法,因为它不必要地打乱了整个数组.为了获得更好的性能,您可以改为进行部分洗牌:
Note that this will not be the most efficient method for getting a small random subset of a large array because it shuffles the whole array unnecessarily. For better performance you could do a partial shuffle instead:
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);
}
这篇关于从数组中采样随机子集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!