在javascript中不替换数组的情况下,随机抽样的干净方法是什么?假设有一个数组
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)];
但是,如果多次执行此操作,则存在多次抢占同一条目的风险。
发布于 2012-08-13 21:30:08
我建议使用Fisher-Yates shuffle对数组的副本进行混洗,然后取一片:
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);
请注意,对于获取大型数组的小随机子集而言,这不是最有效的方法,因为它会对整个数组进行不必要的打乱。为了获得更好的性能,您可以改为执行部分混洗:
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);
}
发布于 2013-10-28 17:27:49
参加聚会有点晚了,但这可以用下划线的新sample方法解决(下划线1.5.2 -2013年9月):
var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var randomFiveNumbers = _.sample(x, 5);
发布于 2012-08-13 22:26:06
或者..。如果您使用underscore.js...
_und = require('underscore');
...
function sample(a, n) {
return _und.take(_und.shuffle(a), n);
}
很简单。
https://stackoverflow.com/questions/11935175
复制相似问题