我建议使用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);
请注意,这不是获取大型数组的随机小子集的最有效方法,因为它会不必要地对整个数组进行洗牌。为了获得更好的性能,您可以执行部分改组:
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);}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)