gpt4 book ai didi

javascript - 从数组中采样随机子集

转载 作者:行者123 更新时间:2023-12-03 02:56:04 25 4
gpt4 key购买 nike

在 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)];

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

最佳答案

我建议使用 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);
}

关于javascript - 从数组中采样随机子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11935175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com