首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从数组中采样随机子集

从数组中采样随机子集
EN

Stack Overflow用户
提问于 2012-08-13 21:25:30
回答 14查看 33.3K关注 0票数 29

在javascript中不替换数组的情况下,随机抽样的干净方法是什么?假设有一个数组

代码语言:javascript
复制
x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

我想随机采样5个唯一的值;即生成一个长度为5的随机子集。要生成一个随机样本,可以这样做:

代码语言:javascript
复制
x[Math.floor(Math.random()*x.length)];

但是,如果多次执行此操作,则存在多次抢占同一条目的风险。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2012-08-13 21:30:08

我建议使用Fisher-Yates shuffle对数组的副本进行混洗,然后取一片:

代码语言:javascript
复制
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);

请注意,对于获取大型数组的小随机子集而言,这不是最有效的方法,因为它会对整个数组进行不必要的打乱。为了获得更好的性能,您可以改为执行部分混洗:

代码语言:javascript
复制
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);
}
票数 52
EN

Stack Overflow用户

发布于 2013-10-28 17:27:49

参加聚会有点晚了,但这可以用下划线的新sample方法解决(下划线1.5.2 -2013年9月):

代码语言:javascript
复制
var x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

var randomFiveNumbers = _.sample(x, 5);
票数 17
EN

Stack Overflow用户

发布于 2012-08-13 22:26:06

或者..。如果您使用underscore.js...

代码语言:javascript
复制
_und = require('underscore');

...

function sample(a, n) {
    return _und.take(_und.shuffle(a), n);
}

很简单。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11935175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档